如何使用Moq来模拟内部类保护的方法?
问题描述:
我有如下类别:如何使用Moq来模拟内部类保护的方法?
public class TestService
{
public void Upload()
{
var manager = new Manager();
var worker = manager.CreateWorker();
worker.DoWork();
}
}
public class Manager
{
public Worker CreateWork()
{
return new Worker();
}
}
public class Worker()
{
public void DoWork()
{
SetupEnvironment();
//some codes here...
}
protected virtual void SetupEnvironment()
{
//some codes here ...
}
}
我想用最小起订量来创建一个上传单元测试(在TestService的类)的方法,以及工人的SetupEnvironment()方法应该嘲笑起来。我试过下面的代码,但它不起作用:
[TestMethod]
public void Upload_Test()
{
var mockWorker = new Mock<Worker>();
mockWorker .Protected().Setup<string>("SetupEnvironment").Returns(() =>
{
//some dummy code here ...
});
var service = new TestService();
service.Upload();
Assert.IsTrue(true);
}
任何人都知道如何使上述单元测试代码工作?
答
有些事情需要改变。请参阅下面的类TestService
和Worker
的代码。
public class TestService
{
private readonly Manager _manager;
public TestService(Manager manager)
{
_manager = manager;
}
public void Upload()
{
var worker = _manager.CreateWorker();
worker.DoWork();
}
}
public class Manager
{
public virtual Worker CreateWorker()
{
return new Worker();
}
}
public class Worker
{
public void DoWork()
{
SetupEnvironment();
//some codes here...
}
protected virtual void SetupEnvironment()
{
//some codes here ...
}
}
然后测试可能看起来像这样。方法SetupEnvironment
是void
,因此设置无法返回任何值,您还需要模拟Manager
并将其传递给TestService
。通过构造函数注入所以你可以注入你的模拟对象。 HTH
[TestMethod]
public void Upload_Test()
{
bool setupEnvironmentWasCalled = false;
Mock<Worker> mockWorker = new Mock<Worker>();
mockWorker.Protected().Setup("SetupEnvironment")
.Callback(() =>
{
//some dummy code here ...
setupEnvironmentWasCalled = true;
});
Mock<Manager> mockManager = new Mock<Manager>();
mockManager.Setup(m => m.CreateWorker())
.Returns(mockWorker.Object);
var service = new TestService(mockManager.Object);
service.Upload();
Assert.IsTrue(setupEnvironmentWasCalled);
}
您的模拟对象是可以的,但是您的测试方法使用的是真实的对象而不是假的对象。这就是问题.... –