【发布时间】:2010-04-29 10:53:15
【问题描述】:
我正在尝试对被测系统 (SUT) 对依赖项调用方法进行单元测试/验证。
- 依赖是 IFoo。
- 依赖类是 IBar。
- IBar 被实现为 Bar。
- 当在 Bar 实例上调用 Start() 时,Bar 将在新的 (System.Threading.Tasks.)Task 中调用 IFoo 上的 Start()。
单元测试(起订量):
[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();
}
IBar 作为 Bar 的实现:
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的简单模拟实现并改用它吗?
标签: c# .net unit-testing .net-4.0 moq