6

このアプローチを使用Actionして、Moq 単体テストで呼び出しを設定および検証できることを期待して、静的メソッド呼び出しを作成しました。

テストされているコードは次のとおりです。

public Action<Data> Calculate = x => CalculatorHelper.Calculate(x);

public void CalculateData(Data data)
{
    ...

    Calculate(data);

    ...
}

テストは次のとおりです。

[Test]
public void CalculateIsCalled()
{
    _mockService.Setup(x => x.Calculate = CalculatorHelper.Calculate)
                .Verifiable();
    ...

    _mockService.VerifyAll();
}

ただし、のパラメーターは、Setup()「式ツリーに代入演算子を含めることはできません」というコンパイル エラーをスローしています。

明らかにコードx => x.Calculate = CalculatorHelper.Calculateは間違っていますが、これをコーディングする正しい方法は何でしょうか?

4

2 に答える 2

8

Calculateを指す新しいアクションを返すCalculatorHelper.Calculate必要があるため、次のようにする必要があります。

_mockService.Setup(x => x.Calculate).Returns(CalculatorHelper.Calculate)
            .Verifiable();

ただし、これが機能するには、フィールドだけでなく、プロパティでCalculateある必要があります。virtual

于 2013-01-17T13:03:30.607 に答える
2

パブリックフィールドであるという事実を考慮すると、CalculateここではMoqも必要ありません(CalculateDataデリゲートを呼び出すテストを行っていると仮定します)。

Data passedAsActionParameter = null;
var testedClass = new Calculator();
testedClass.Calculate = d => { passedAsActionParameter = d; };
var data = new Data();
testedClass.CalculateData(data);

Assert.That(passedAsActionParameter, Is.EqualTo(data));
于 2013-01-17T13:17:24.973 に答える