【发布时间】:2012-03-23 12:53:27
【问题描述】:
我正在尝试测试一个采用工厂 (Func<T>) 的类,并且我正在使用 Moq 和 AutoFixture。
设置“环境”以查看工厂是否已使用以及在返回的实例上使用了多少次以及使用了哪些方法的最佳方法是什么?
目前我正在模拟T 和Injecting 一个Func<T>,它记录所有返回的Mock 实例:
public class SystemUnderTest {
public SystemUnderTest(Func<IMyClass> c)
{
try {
var c1 = c();
c1.Name="n1";
c1.Send();
}
catch(Exception){
var c2 = c();
c2.Name="n2";
c2.Send();
}
}
}
private Mock<IMyClass> MockFactory()
{
var m = new Mock<IMyClass>();
m.SetupProperty(mc=>mc.Name);
_returnedStubs.Add(m);
return m;
}
[Test]
public void TestSomething()
{
var fixture = new Fixture();
fixture.Inject(()=>MockFactory().Object)
var sut = fixture.CreateAnonymous<SystemUnderTest>();
Assert.That(_returnedStubs.Count,Is.Equal(1));
_returnedStubs[0].Verify(m=>m.Send(),Times.Exactly(1));
_returnedStubs[0].Verify(m=>m.Name = "n1");
}
但这对我来说有点可疑/丑陋。而且我很确定测试类中的实例变量是一件危险的事情
【问题讨论】:
-
虽然我意识到这可能是为了将问题减少到可管理的大小,但我想知道您正在尝试做什么? MyClass 是一个具体的类吗?为什么创建多少次很重要?
-
这很有趣,因为
IMyClass是一个用于收集数据并将其发送到网络服务的类。但是,如果 IMyClass 的第一个实例的数据收集引发异常,则使用特定消息创建另一个实例,我想验证:“当 instance1 引发异常时:1) instance2 被创建,2) instance2 得到第一个异常的消息,以及 3) 不应创建更多实例" -
我明白了。但是,您在 IMyClass API 中有时间耦合,这使得测试变得更加困难。如果您更改 API 以启用
c1.Send("n1");之类的功能,则测试起来会更容易......这条特定的反馈确实与 AutoFixture 无关,但它也会让这变得更容易。
标签: c# moq autofixture