0

これは、ラインをテストしている例ですif (true)。しかし、条件は明らかに true ですが、Moq はメソッドが呼び出されていないことを教えてくれます。

    public class test
    {
        public virtual void start()
        {
            if (true)
                called();
        }

        public virtual void called()
        {

        }
    }

    [Test]
    public void QuickTest()
    {
        var mock = new Mock<test>();
        mock.Object.start();
        mock.Verify(t => t.start(), "this works");
        mock.Verify(t => t.called(), "crash here: why not called?");
    }

へのメソッド呼び出しが行われたことをテストするにはどうすればよいcalled()ですか?

Moqが解決策だと思っていましたが、コメントからはそうではないように見えるので、Moqを参照せずに別の例を作成しました:

public class test
{
    public bool condition = true;

    public test(bool cond)
    {
        condition = cond;
    }

    public virtual string start()
    {
        var str = "somestuff";

        if (condition)
            str += called();

        str += "something more";
        return str;
    }

    public virtual string called()
    {
        return "something more";
    }
}

[Test]
public void ConditionTrue_CallsCalled()
{
    var t = new test(true);
    t.start();
    //syntax? t.HasCalled("called");
    Assert.IsTrue(result.Contains("something more"));
}

[Test]
public void ConditionFalse_NoCall()
{
    var t = new test(false);

    t.start();

    //syntax? t.HasNotCalled("called");
    // Can't check this way because something more is already being added
    Assert.IsFalse(result.Contains("something more")); 
}

これを行うことは可能ですか?それは価値がありますか?

4

1 に答える 1

0

最初のコードについて:

mockモックオブジェクトです。つまり、すべてのメソッドがオーバーライドされ、何もしません。mock.start()したがって、呼び出しが何も行わず、呼び出されないことはまったく正常ですcalled()

called()単にモックして の実際の実装を使用したい場合はstart()、部分的なモックを行う必要があります。

しかし、私はそれに対してアドバイスします。このクラスだけをテストしようとすることに対してもアドバイスします。テスト コードを実装コードに強く結合しすぎます。TDD の実行について考えてみてください。テストがない場合、アプリケーションのどの機能が壊れているかを自問してください。その機能に対するテストを作成します。これは失敗するはずです。次に、if テストを記述してテストを修正します。

于 2013-08-25T20:43:24.473 に答える