如何使用Moq验证静态方法调用

时间:2013-01-17 12:58:51

标签: c# linq unit-testing moq

使用this approach我已经让我的静态方法调用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不正确,但是对此进行编码的正确方法是什么?

2 个答案:

答案 0 :(得分:7)

Calculate应该返回一个指向CalculatorHelper.Calculate的新动作,所以它应该是:

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

但是,为了实现这一目标,Calculate必须是virtual属性,而不仅仅是字段。

答案 1 :(得分: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));