1

クラスの 1 つをテストしているときに、ちょっとした問題に遭遇しました。1 つのパブリック メソッドと 2 つの保護された抽象を一度に含む抽象クラスがあります。天気予報パブリック メソッド呼び出しを抽象化の 1 つを 1 回テストする必要があります。

私のコードがどのように見えるかの例を次に示します。

public abstract class A
{
    public string DoSomething(stirng input)
    {
        var output = new StringBuilder();

        foreach (var currentChar in input)
        {
            output.Append(DoSomethingElse(currentChar));
        }

        return output.ToString();
    }

    protected abstract char DoSomethingElse(char charToChange);
}

public class B : A
{
    protected override char DoSomethingElse(char charToChange)
    {
        var changedChar = charToChange;
        // Some logic changing charToChange's value
        return changedChar;
    }
}

DoSomethingElse()は保護されているため、そのメソッドを公開するクラスを作成しました

public class BPublisher : B
{
    public virtual new char DoSomethingElse()
    {
        return base.DoSomethingElse()
    }
}

私の質問は、 Rhino モックを使用してDoSomething()呼び出されたという事実をどのようにテストするのですか?DoSomethingElse()

PS and を使用してみExpectましAssertWasCalledたが、成功しませんでした。

4

2 に答える 2

2

本当にこれをテストする必要がありますか? 単体テストでは、一連の入力に基づいて出力をテストする必要があります。これをどのように実装するかは、テストには関係ありません (出力には、オブジェクトの結果のメンバー/状態を含めることができます)。

たとえば、クラスを大幅にリファクタリングしても、テストに合格する必要があります。たとえば、私があなたに入力を与えても、出力は得られますか。実装が異なる場合にテストが失敗することを本当に望んでいません(実装についてはあまり気にしないため)

于 2013-02-06T14:26:21.347 に答える
1

を使用して別のメソッドを宣言するnewと、元の保護されたメソッドとは関係ありません。仮想ではないため、モックを作成することはできません。モックを作成するためのテストクラスを派生させるため、それを仮想化してモックにするのはちょっと奇妙です。

この場合、私は実際にモックを使用しようとしません。プロパティで有用な結果を返さないのはなぜですか?

public class BPublisher : B
{
    public readonly StringBuilder chars = new StringBuilder();

    public virtual new char DoSomethingElse(char charToChange)
    {
        chars.Append(charToChange);
        return charToChange;
    }
}

var a = new BPublisher();
a.DoSomething("abc");
Assert.AreEqual("abc", a.chars.ToString());

最後はやはり変です。抽象基本クラスをテストするのが難しい場合があります。公開することも考えられますDoSomethingElse

于 2013-02-06T15:14:16.100 に答える