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 回答