4

2 つのコールバック アクションを持つクラスがあります。

public class MyClass
{
    public void DoSomething(Action onSuccess, Action onFailure)
    { }
}

このためのテストを作成しようとしていますが、onSuccess実行されたことを「アサート」する方法がわかりませんか?

[Test]
public void ChangePassword_returns_false_if_user_does_not_exist()
{
    var myClass = new MyClass(mockedDependency.Object);

    myClass.DoSomething( //what do i need to pass in, in order to Assert that onSuccess Action was executed?)
}
4

1 に答える 1

5

いくつかのフラグを変更するアクションを作成できます:

[Test]
public void ChangePassword_returns_false_if_user_does_not_exist()
{
    var myClass = new MyClass(mockedDependency.Object);
    bool isExecuted = false; // flag to check
    Action success = () => isExecuted = true; // set flag to true when executed

    myClass.DoSomething(success, null);
    Assert.IsTrue(isExecuted); // check if flag changed
}

または、インプレース ラムダを使用してフラグを変更することもできます。

[Test]
public void ChangePassword_returns_false_if_user_does_not_exist()
{
    var myClass = new MyClass(mockedDependency.Object);
    bool isExecuted = false; // flag to check
    myClass.DoSomething(() => isExecuted = true, null);
    Assert.IsTrue(isExecuted); // check if flag changed
}

もう 1 つのアプローチ - Moq を使用して、アクションが呼び出されたかどうかを確認できます。この場合、フラグは必要ありません。Action最初に、デリゲート シグネチャに一致するメソッドを持つインターフェイスが必要になります。

public interface IHelper // consider better name
{
    void ShouldRun();
    void ShouldNotRun();
}

次に、モックを使用して、アクションが呼び出された回数を確認できます。

[Test]
public void ChangePassword_returns_false_if_user_does_not_exist()
{
    Mock<IHelper> helper = new Mock<IHelper>();            
    var myClass = new MyClass(ockedDependency.Object);
    myClass.DoSomething(helper.Object.ShouldRun, helper.Object.ShouldNotRun);

    helper.Verify(h => h.ShouldRun(), Times.Once());
    helper.Verify(h => h.ShouldNotRun(), Times.Never());
}
于 2013-06-27T15:32:46.510 に答える