假设我有这个接口和这个类:
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创建的。“
有什么建议吗?
在command类中有类似这样的内容:
public void Execute()
{
// some code
Scheduler.GetScheduler().StopTimer();
}
发布于 2018-06-13 06:03:50
如果你将试图替换的调用包装在一个虚拟的调用中,你可以这样做:
public class Scheduler : IScheduler
{
private static readonly IScheduler scheduler = CreateScheduler();
private readonly Timer timer;
public Scheduler()
{
refreshTimer = new Timer
{
Enabled = false,
AutoReset = false
};
}
public static IScheduler GetScheduler()
{
return scheduler;
}
public void StopTimer()
{
timer.Stop();
}
public virtual IScheduler CreateScheduler()
{
return new Scheduler();
}
// some other methods
}
然后在你的单元测试类中:
[TestClass]
public class TestClass
{
[TestMethod]
public void testMethod()
{
var scheduler = new Mock<Scheduler>();
// you can now call .setup on the scheduler instance and use this mock.
var sut = new SchedulerWrapper(scheduler.Object);
///var sut....sometests
}
}
internal class SchedulerWrapper : Scheduler
{
private Scheduler _scheduler;
public SchedulerWrapper(Scheduler scheduler)
{
_scheduler;
}
public overrride IScheduler CreateScheduler()
{
return _scheduler;
}
}
https://stackoverflow.com/questions/50826056
复制相似问题