我想单元测试/验证一个方法正在被测系统(SUT)上的依赖关系上调用。当SUT利用任务并行Libaray进行单元测试Mock
- 依赖性是IFoo。
- 依赖类是IBar。
- IBar以Bar的形式实现。
- 当在Bar实例上调用Start()时,Bar会在新的(System.Threading.Tasks。)任务中调用IFoo的Start()。
单元测试(MOQ):
[Test]
public void StartBar_ShouldCallStartOnAllFoo_WhenFoosExist()
{
//ARRANGE
//Create a foo, and setup expectation
var mockFoo0 = new Mock<IFoo>();
mockFoo0.Setup(foo => foo.Start());
var mockFoo1 = new Mock<IFoo>();
mockFoo1.Setup(foo => foo.Start());
//Add mockobjects to a collection
var foos = new List<IFoo>
{
mockFoo0.Object,
mockFoo1.Object
};
IBar sutBar = new Bar(foos);
//ACT
sutBar.Start(); //Should call mockFoo.Start()
//ASSERT
mockFoo0.VerifyAll();
mockFoo1.VerifyAll();
}
伊巴尔的实施,酒吧:
class Bar : IBar
{
private IEnumerable<IFoo> Foos { get; set; }
public Bar(IEnumerable<IFoo> foos)
{
Foos = foos;
}
public void Start()
{
foreach(var foo in Foos)
{
Task.Factory.StartNew(
() =>
{
foo.Start();
});
}
}
}
起订量异常:
*Moq.MockVerificationException : The following setups were not matched:
IFoo foo => foo.Start() (StartBar_ShouldCallStartOnAllFoo_WhenFoosExist() in
FooBarTests.cs: line 19)*
是否有什么特别的原因不要自己编写一个简单的'IFoo'模拟实现并使用它呢? – 2010-04-29 11:46:21