3

次のテストを検討してください。

[Theory, MyConventions]
public void GetClientExtensionReturnsCorrectValue(BuilderStrategy sut)
{
    var expected = ""; // <--??? the value injected into BuilderStrategy
    var actual = sut.GetClientExtension();
    Assert.Equal(expected, actual);
}

そして、私が使用しているカスタム属性:

public class MyConventionsAttribute : AutoDataAttribute {
    public MyConventionsAttribute()
        : base(new Fixture().Customize(new AutoMoqCustomization())) {}
}

そしてSUT:

class BuilderStrategy {
    private readonly string _clientID;
    private readonly IDependency _dependency;
    public void BuilderStrategy(string clientID, IDependency dependency) {
        _clientID = clientID;
        _dependency = dependency;      
    }
    public string GetClientExtension() {
        return _clientID.Substring(_clientID.LastIndexOf("-") + 1);
    }
}

clientIDの出力と比較するために使用できるように、コンストラクター パラメーターに挿入された値を知る必要がありますGetClientExtension。SUT がテスト メソッドに挿入されるこのスタイルのテストを書きながら、これを行うことは可能ですか?

4

1 に答える 1

6

clientID挿入された(およびdependency同様に) 読み取り専用プロパティを公開する場合は、いつでもそれらの値を照会できます。

public class BuilderStrategy {
    private readonly string _clientID;
    private readonly IDependency _dependency;
    public void BuilderStrategy(string clientID, IDependency dependency) {
        _clientID = clientID;
        _dependency = dependency;      
    }
    public string GetClientExtension() {
        return _clientID.Substring(_clientID.LastIndexOf("-") + 1);
    }

    public string ClientID
    {
        get { return _clientID; }
    }

    public IDependency Dependency
    {
        get { return _dependency; }
    }
}

これはカプセル化を壊しませんが、構造検査として知られています。

この変更により、テストを次のように書き直すことができるようになりました。

[Theory, MyConventions]
public void GetClientExtensionReturnsCorrectValue(BuilderStrategy sut)
{
    var expected = sut.ClientID.Substring(sut.ClientID.LastIndexOf("-") + 1);
    var actual = sut.GetClientExtension();
    Assert.Equal(expected, actual);
}

単体テストで製品コードを複製することを好まない人もいますが、テスト駆動開発に従う場合、テスト コードを複製するのは製品コードであると主張したいと思います。

いずれにせよ、これはDerived Valueとして知られる手法です。私の意見では、循環的複雑度が 1 である限り、テストは信頼できます。さらに、重複したコードが 2 か所にしか現れない限り、3 のルールは、そのように保つべきであることを示唆しています。

于 2013-08-14T17:55:48.663 に答える