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派生元であることに注意してください。CompositeCustomization

また読むことができます:

それが役立つことを願っています。

于 2013-03-05T05:23:19.180 に答える
0

簡潔で読みやすいと思います。しかし、私はこの種のテストの価値を疑問視しています。

あなたのテストはCustomerPropertyIsCorrectという名前なので、これがテストしたいものだと思います。ICustomerAdapterのBuildCustomerメソッドに以前に作成した凍結されたインスタンスを返すように指示し、ビュー モデル コードが xUnit で実行されるときにこのコードを使用するため、確かに凍結されたオブジェクトが返されます。

現在、私は (まだ) TDD 陣営に完全に参加しているわけではないので、TDD を「取得」していないのは私だけかもしれません。しかし、私が見る限り、このテストでは、ビュー モデルのCustomer プロパティにCardHolderCustomerインスタンスがあることを確認しますが、必ずしも「正しい」インスタンスであるとは限りません。その価値はどこにありますか?

于 2013-04-15T07:22:07.003 に答える