有效设置的模拟设置异常
Mock Setup Exception for valid setup
我有以下 classes 结构:
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;
}
}
然后是消费者class
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.All 对模拟的调用必须有相应的设置。”这很奇怪,因为我有该输入的设置。
这是 Moq 框架的预期行为吗?有什么办法可以解决这个问题吗?
谢谢
您的 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
:
[SetUp]
public void SetUp()
{
// setup only for cases where obj.Number == 1
_service
.Setup(x => x.ProcessInt(It.Is<MyObj>(o => o.Number == 1 )))
.Returns(1);
// setup only for cases where obj.Number == 2
_service
.Setup(x => x.ProcessInt(It.Is<MyObj>(o => o.Number == 2 )))
.Returns(2);
}
我有以下 classes 结构:
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;
}
}
然后是消费者class
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.All 对模拟的调用必须有相应的设置。”这很奇怪,因为我有该输入的设置。
这是 Moq 框架的预期行为吗?有什么办法可以解决这个问题吗?
谢谢
您的 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
:
[SetUp]
public void SetUp()
{
// setup only for cases where obj.Number == 1
_service
.Setup(x => x.ProcessInt(It.Is<MyObj>(o => o.Number == 1 )))
.Returns(1);
// setup only for cases where obj.Number == 2
_service
.Setup(x => x.ProcessInt(It.Is<MyObj>(o => o.Number == 2 )))
.Returns(2);
}