AutoFixture使用手动假货的AutoData理论

Tru*_*ill 7 moq xunit.net autofixture automocking

鉴于此系统要测试:

public class MySut
{
    private readonly IHardToMockDependency _hardToMockDependency;

    public MySut(IHardToMockDependency hardToMockDependency,
                 IOtherDependency otherDependency)
    {
        _hardToMockDependency = hardToMockDependency;
    }

    public string GetResult()
    {
        return _hardToMockDependency.GetResult();
    }
}

public interface IOtherDependency { }

public interface IHardToMockDependency
{
    string GetResult();
}
Run Code Online (Sandbox Code Playgroud)

而这个单元测试:

internal class FakeHardToMockDependency : IHardToMockDependency
{
    private readonly string _result;

    public FakeHardToMockDependency(string result)
    {
        _result = result;
    }

    public string GetResult()
    {
        return _result;
    }
}

public class MyTests
{
    [Fact]
    public void GetResultReturnsExpected()
    {
        string expectedResult = "what I want";
        var otherDependencyDummy = new Mock<IOtherDependency>();
        var sut = new MySut(new FakeHardToMockDependency(expectedResult),
                            otherDependencyDummy.Object);

        var actualResult = sut.GetResult();

        Assert.Equal(expectedResult, actualResult);
    }
}
Run Code Online (Sandbox Code Playgroud)

我应该如何将其转换为使用AutoFixture.Xunit和AutoFixture.AutoMoq(同时仍然使用手动假)?

在实际测试中,手动假冒将具有更复杂的界面和行为.请注意,我想将匿名变量(expectedResult字符串)传递给手动伪造的构造函数.

Mar*_*ann 9

这里已经有了一些很好的答案,但是我想建议一个更简单的替代方法,它会略微放松FakeHardToMockDependency类的不变量.将其公开,并提供一种方法来分配与构造函数分离的结果:

public class FakeHardToMockDependency : IHardToMockDependency
{
    private string _result;

    public FakeHardToMockDependency(string result)
    {
        _result = result;
    }

    internal string Result
    {
        get { return _result; }
        set { _result = value; }
    }

    public string GetResult()
    {
        return _result;
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,我已添加内部属性并readonly从字段中删除了关键字.

这使您可以将原始测试重构为:

[Theory, AutoMoqData]
public void GetResultReturnsExpected_AutoDataVersion(
    [Frozen(As = typeof(IHardToMockDependency))]FakeHardToMockDependency fake,
    MySut sut)
{
    var expected = "what I want";
    fake.Result = expected;

    var actual = sut.GetResult();

    Assert.Equal(expected, actual);
}
Run Code Online (Sandbox Code Playgroud)

为完整起见,这是AutoMoqDataAttribute代码:

public class AutoMoqDataAttribute : AutoDataAttribute
{
    public AutoMoqDataAttribute()
        : base(new Fixture().Customize(new AutoMoqCustomization()))
    {
    }
}
Run Code Online (Sandbox Code Playgroud)