我在我的测试约定中使用AutoMoqCustomization.
请考虑以下代码.在我将一个构造函数添加到其中一个具体类之前,一切都很有效.当我这样做时,我得到"找不到无参数构造函数".我们知道AutoFixture没有构造函数的问题,因为它向我提供了测试对象one
,该对象被证明可以从IThings分配......没有失败.所以一定是moq.
这builder
有点意义,因为我假设是由moq生成并传递给GetCommands
方法.所以我想我可以看到控件已经从AutoFixture传递到moq.
这样可以解决原因,但我该怎么做呢?有没有办法指示moq如何处理ThingOne
或有没有办法指示AutoFixture忽略moq for IThingBuilders
而是做一些Fixtury?
public class TestClass
{
public interface IThingBuilders
{
T1 Build<T1>() where T1 : IThings;
}
public interface IThings
{
}
public class ThingOne : IThings
{
public ThingOne(string someparam)
{
}
}
public class ThingTwo : IThings
{
}
public class SomeClass
{
public List<IThings> GetCommands(IThingBuilders builder)
{
var newlist = new List<IThings>();
newlist.Add(builder.Build<ThingOne>());
newlist.Add(builder.Build<ThingTwo>());
return newlist;
}
}
[Theory, BasicConventions]
public void WhyCannotInstantiateProxyOfClass(ThingOne one, ThingTwo two, IThingBuilders builder, SomeClass sut)
{
Assert.IsAssignableFrom<IThings>(one);
Assert.IsAssignableFrom<IThings>(two);
var actual = sut.GetCommands(builder);
Assert.Equal(1, actual.OfType<ThingOne>().Count());
Assert.Equal(1, actual.OfType<ThingTwo>().Count());
}
}
Run Code Online (Sandbox Code Playgroud)
由于 Moq 中没有可扩展点使 AutoFixture 能够挂接并提供 值ThingOne
,因此您无能为力。
但是,您可以使用SetReturnsDefault<T>
起订量的方法。修改上面的测试将是这样的:
[Theory, BasicConventions]
public void WhyCannotInstantiateProxyOfClass(
ThingOne one, ThingTwo two, IThingBuilders builder, SomeClass sut)
{
Assert.IsAssignableFrom<IThings>(one);
Assert.IsAssignableFrom<IThings>(two);
Mock.Get(builder).SetReturnsDefault(one); // Add this to make the test pass
var actual = sut.GetCommands(builder);
Assert.Equal(1, actual.OfType<ThingOne>().Count());
Assert.Equal(1, actual.OfType<ThingTwo>().Count());
}
Run Code Online (Sandbox Code Playgroud)
这比编写特定的Setup
/Returns
对要容易一些,但也不是很多。您可以将该代码移至 AutoFixture 自定义,但同样,由于这是 Mock 实例上的通用方法,因此您明确需要为 ThingOne 等调用此方法,以便设置该返回类型的默认值。不是特别灵活。
归档时间: |
|
查看次数: |
905 次 |
最近记录: |