我想创建一个自定义项,将AutoFixture配置为传递类型,它实现了对Moq的实现。我怎么能这样做呢?
澄清一下,请考虑:
public class test
{
public string foo;
public test(IDictionary<string, string> stuffing)
{
foo = stuffing["bogus"];
}
}
[TestMethod]
public void testInjection()
{
var fixture = new Fixture();
bool didThrow;
try
{
var sut = fixture.Create<test>();
didThrow = false;
}
catch
{
didThrow = true;
}
Assert.IsTrue(didThrow);
}
测试通过。 AutoFixture为我提供了与IDictionary兼容的虚拟集合。我希望测试失败...具体来说,我希望将IDictionary交给Moq并获得一些默认情况下不会抱怨丢失键的内容。
我想使用类似fixture.UseAutoMoq().ForceRelay<Dictionary<string,string>>()
的内容。
我也愿意接受更好的建议......但考虑密封测试类。我正在测试使用这种模式的代码,我想要围绕它进行测试约定。
答案 0 :(得分:3)
要执行您要求的操作,您可以将MockRelay
添加到AutoMoqCustomization
并将其移至众所周知的馆藏建设者面前:
[Fact]
public void PassByMovingAutoMoqRelay()
{
var fixture = new Fixture().Customize(new AutoMoqCustomization());
var relay = fixture.ResidueCollectors.OfType<MockRelay>().Single();
fixture.Customizations.Add(relay);
var sut = fixture.Create<MyClass>(); // Doesn't throw
}
但是,我认为这不是一个好主意,因为大多数.NET集合界面都是严重的LSP违规行为,并且无法保证自动模拟他们会产生有意义的行为 - 我希望情况恰恰相反。