模拟设置有效设置的例外

时间:2016-03-07 18:25:09

标签: c# unit-testing nunit moq

我有以下类结构:

public class MyObj
{
    public int Number;
}
public interface IService
{
    int ProcessInt(MyObj obj);
}
public class Service : IService
{
    public int ProcessInt(MyObj myObj)
    {
        return myObj.Number;
    }
}

然后是消费者类

public class Class1
{
    public void Run(IService s)
    {
        var obj = new MyObj {Number = 1};
        Console.WriteLine(s.ProcessInt(obj));
    }
}

然后是单元测试

[TestFixture]
public class MyTest
{

    private readonly Mock<IService> _service = new Mock<IService>(MockBehavior.Strict);
    private readonly Class1 _sut = new Class1();

    [SetUp]
    public void SetUp()
    {
        var obj = new MyObj {Number = 1};
        _service.Setup(x => x.ProcessInt(obj)).Returns(1);
    }

    [Test]
    public void TestClass1()
    {
        _sut.Run(_service.Object);
    }
}

我遇到的问题是,当我运行单元测试时,我得到“ Moq.MockException:IService.ProcessInt(MoqStuff.MyObj)调用失败,模拟行为Strict。模拟上的所有调用必须具有相应的设置。“这很奇怪,因为我有输入的设置。

这是Moq框架的预期行为吗?有什么方法可以解决这个问题吗?

谢谢

1 个答案:

答案 0 :(得分:3)

您的var path = require('path'); var configFile = path.resolve('./deployconfig.json'); var config = require(configFile); contentPath: config[0].contentPath, wmsvc: config[0].serverAddress, userName: config[0].userName, password: config[0].password 方法中包含此代码:

SetUp

在此设置期望值,使用此特定对象var obj = new MyObj {Number = 1}; _service.Setup(x => x.ProcessInt(obj)).Returns(1); 调用ProcessInt

但是,在方法obj中,您创建了另一个对象:

Run

虽然属性值相同,但此对象与您在var obj = new MyObj {Number = 1}; 方法中创建的对象完全不同。这就是为什么你得到关于缺少设置的例外的原因。

您可以使用SetUp

为任何输入参数设置服务
It.IsAny

此设置适用于任何参数值。

或者,如果您只想根据某些条件进行匹配,可以使用[SetUp] public void SetUp() { _service.Setup(x => x.ProcessInt(It.IsAny<MyObj>())).Returns(1); }

It.Is