我正在使用Nunit和Autofac的Moq来设置测试
[TestFixture]
public class SomeTests
{
[OneTimeSetUp]
public void Initialize()
{
}
[Test]
public void SalaryCheck()
{
using (var mock = AutoMock.GetLoose())
{
// Arrange
mock.Mock<ICommonServices>().Setup(x => x.AddTwoNumbers(1,2)).Returns(5);
var sut = mock.Create<SomeManager>();
// Act
int actul = sut.CalculateSalary(1);
var expected = 5;
// Assert
Assert.AreEqual(expected, actul);
}
}
}
CalculateSalary函数看起来像这样
public int CalculateSalary(int hours)
{
var addres = _commonService.AddTwoNumbers(5,3);
if (addres == 5)
{
return addres * hours;
}
else
{
return 100;
}
}
我想要AddTwoNumbers函数,这是一个外部依赖,无论如何返回5。这就是为什么我在嘲笑之后设置它。但是,当我调试这个测试时,看起来它进入了calsulate薪水函数,但返回一个&#34; 0&#34;用于AddTwoNumbers功能。这是一种默认值或空值。
它没有归还我5,即我将其设置为返回。
答案 0 :(得分:3)
您需要使用It.IsAny<int>()
即。
mock.Mock<ICommonServices>().Setup(x => x.AddTwoNumbers(It.IsAny<int>(),It.IsAny<int>())).Returns(5);
答案 1 :(得分:0)
模拟返回抽象的方法时,请确保对 It.IsAny
给出一个采用 IEnumerable 作为参数的方法:
interface IQueueItemRepository {
IQueueItem GetFirstNotIn(IEnumerable<Guid> guids)
}
在下面的示例中,仅当使用 Collection 作为参数调用 .GetFirstNotIn 时,才会调用 .Setup 。
Mock<IQueueItemRepository> queueMock = new Mock<IQueueItemRepository>();
queueMock
.Setup(x => x.GetFirstNotIn(It.IsAny<Collection<Guid>>()))
.Returns(new QueueItem());
换句话说,如果您正在测试的代码永远不会调用带有 Collection 的 .GetFirstNotIn ,那么您的 .Setup 将永远不会被调用。可能在整个代码中以 IEnumerable 作为参数对其进行了多次调用,但这些调用与 .Setup 不匹配。
因此请确保将参数类型与 .Setup 类型相匹配:
Mock<IQueueItemRepository> queueMock = new Mock<IQueueItemRepository>();
queueMock
.Setup(x => x.GetFirstNotIn(It.IsAny<IEnumerable<Guid>>()))
.Returns(new QueueItem());