10

此测试是否正确使用 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);
}
4

2 回答 2

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();
        }
    }
}

原始测试可以写成

[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);
}

DomainTestConventionsAttribute定义为:

internal class DomainTestConventionsAttribute : AutoDataAttribute
{
    internal DomainTestConventionsAttribute()
        :base(new Fixture().Customize(new DomainTestConventions()))
    {
    }
}

DomainTestConventions定义为:

internal class DomainTestConventions : CompositeCustomization
{
    internal DomainTestConventions()
        :base(new AutoMoqCustomization())
    {
    }
}

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

您还可以阅读:

希望有帮助。

于 2013-03-05T05:23:19.180 回答
0

我认为这是简洁易读的。但我质疑这种测试的价值。

您的测试名为CustomerPropertyIsCorrect,所以我假设这是您想要测试的。由于您指示 ICustomerAdapter 的BuildCustomer方法返回之前创建的冻结实例,并且由于视图模型代码在 xUnit 中运行时将使用此代码,所以是的,冻结对象确实会返回。

现在,我还没有完全加入 TDD 阵营,所以这可能只是我,而不是“获得” TDD。但据我所知,这个测试将验证视图模型在其 Customer 属性中有一些CardHolderCustomer实例——但不一定是“正确的”实例。这其中的价值在哪里?

于 2013-04-15T07:22:07.003 回答