强制转发到嘲弄框架

时间:2015-03-05 04:51:15

标签: c# moq autofixture

我想创建一个自定义项,将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>>()的内容。

我也愿意接受更好的建议......但考虑密封测试类。我正在测试使用这种模式的代码,我想要围绕它进行测试约定。

1 个答案:

答案 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违规行为,并且无法保证自动模拟他们会产生有意义的行为 - 我希望情况恰恰相反。