此测试是否正确使用AutoFixture和Moq?

coc*_*lla 10 moq mocking autofixture

此测试是否正确使用AutoFixture和Moq?它是尽可能简明扼要地写的吗?正如预期的那样,测试失败,并在写完正确的实现后通过.

[Fact]
public void CustomerPropertyIsCorrect()
{
    var fixture = new AutoMoqFixture();

    var expected = fixture.Create<CardHolderCustomer>();
    var builderMock = fixture
        .Freeze<Mock<ICustomerAdapter>>()
        .Setup(x => x.BuildCustomer()).Returns(expected);

    var sut = fixture.Create<CardHolderViewModel>();
    var actual = sut.Customer;

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

Nik*_*nis 17

它看起来不错!但是,您也可以使用 xUnit.net 扩展名以声明方式使用它.

假设测试中使用的类型定义为:

public class CardHolderCustomer
{
}

public interface ICustomerAdapter
{
    CardHolderCustomer BuildCustomer();
}

public class CardHolderViewModel
{
    private readonly ICustomerAdapter adapter;

    public CardHolderViewModel(ICustomerAdapter adapter)
    {
        if (adapter == null)
            throw new ArgumentNullException("adapter");
        this.adapter = adapter;
    }

    public CardHolderCustomer Customer
    {
        get
        {
            return this.adapter.BuildCustomer();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

原始测试可以写成:

[Theory, DomainTestConventions]
public void CustomerPropertyIsCorrect2(
    CardHolderCustomer expected,
    [Frozen]Mock<ICustomerAdapter> builderStub,
    CardHolderViewModel sut)
{
    builderStub
        .Setup(x => x.BuildCustomer())
        .Returns(expected);

    var actual = sut.Customer;

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

DomainTestConventionsAttribute定义为:

internal class DomainTestConventionsAttribute : AutoDataAttribute
{
    internal DomainTestConventionsAttribute()
        :base(new Fixture().Customize(new DomainTestConventions()))
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

DomainTestConventions定义为:

internal class DomainTestConventions : CompositeCustomization
{
    internal DomainTestConventions()
        :base(new AutoMoqCustomization())
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,DomainTestConventions派生的CompositeCustomization基本上意味着您可以创建更多自定义项并将它们作为参数添加到基础构造函数中.

您还可以阅读:

希望有所帮助.

  • 我只需要添加...你重现我的代码盲的事实证明比任何敏捷书都更好,测试是代码文档的主要来源. (10认同)