gpt4 book ai didi

c# - 是否可以使用 Moq 从实例中获取模拟实例?

转载 作者:行者123 更新时间:2023-11-30 15:16:01 26 4
gpt4 key购买 nike

假设我有这个接口(interface)和这个类:

public interface IScheduler
{
void StopTimer();

// some other methods
}

public class Scheduler : IScheduler
{
private static readonly IScheduler scheduler = new Scheduler();

private readonly Timer timer;

public Scheduler()
{
refreshTimer = new Timer
{
Enabled = false,
AutoReset = false
};
}

public static IScheduler GetScheduler()
{
return scheduler;
}

public void StopTimer()
{
timer.Stop();
}

// some other methods
}

所以我想知道是否可以从 GetScheduler 方法中获取模拟实例。我试过这样的事情:

[TestMethod]
public void Execute_ButtonClicked_StopTimer()
{
// arrange
var mockScheduler = Mock.Get(Scheduler.GetScheduler());
var command = GetCommandInstance();

// act
command.Execute();

// assert
mockScheduler.Verify(m => m.StopTimer());
}

但没有用,它说“System.ArgumentException:对象实例不是由 Moq 创建的。”

有什么建议吗?

在命令类中有这样的东西:

public void Execute()
{
// some code
Scheduler.GetScheduler().StopTimer();
}

最佳答案

我提出了一种不同的方法,可以避免这样做......

Scheduler 类正在实现单例模式以控制其构造。您需要能够从构造方式中抽象出依赖于 IScheduler 的事物。所以 else 应该负责管理调度程序的构造:它不应该自己做,因为构造不是那个类的责任 (single responsibility principle)。

常见的方法是使用四人组 Factory method pattern , 或 service locator pattern (例如微软的 UnityContainer)。这些中的任何一个都可以被定向为将该类公开为单例,而使该类仅作为该类所负责内容的实现。

Dependency Injection完成拼图是因为当类注入(inject)了它们的依赖关系时,它们本身就会从它们使用的事物的构造中抽象出来。因此,需要 IScheduler 的类将注入(inject)并使用它。

有了这些模式,做问题中要求的事情的需求就消失了,并导致代码具有明确的关注点分离。

脚注:我知道这些模式的东西看起来令人生畏,而且似乎为此付出了很多努力,而且很难看到好处;但请相信我:尝试这个(我的意思是真的尝试一下,你不能只是三心二意的尝试,因为这是方法上的一个很大的改变)。我曾经像您发布的那样编写代码。有人建议我看看这些模式。我曾有过严重的怀疑,但我从未回头,现在我所有的代码都是这样写的。

关于c# - 是否可以使用 Moq 从实例中获取模拟实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50826056/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com