最小起订量设置未返回预期值
moq setup not returning expected value
我正在使用 Nunit 和 Autofac 的最小起订量来设置测试
[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 函数,它是一个外部依赖项,无论如何都要 return 5。这就是为什么我在嘲笑它之后设置它。但是当我调试这个测试时,它看起来像是进入了 calsulate salary 函数,但是 return 是 AddTwoNumbers 函数的“0”。这是一种默认值或空值。
它不会 return 我 5 即我将其设置为 return。
您需要使用It.IsAny<int>()
即
mock.Mock<ICommonServices>().Setup(x => x.AddTwoNumbers(It.IsAny<int>(),It.IsAny<int>())).Returns(5);
当模拟一个 returns 抽象的方法时,确保你调用 It.IsAny< YourType >() 的类型与您正在模拟的方法的参数类型。
给定一个将 IEnumerable 作为参数的方法:
interface IQueueItemRepository {
IQueueItem GetFirstNotIn(IEnumerable<Guid> guids)
}
在下面的示例中,.Setup 只会在 .GetFirstNotIn 被调用时被调用 集合 作为参数。
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());
我正在使用 Nunit 和 Autofac 的最小起订量来设置测试
[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 函数,它是一个外部依赖项,无论如何都要 return 5。这就是为什么我在嘲笑它之后设置它。但是当我调试这个测试时,它看起来像是进入了 calsulate salary 函数,但是 return 是 AddTwoNumbers 函数的“0”。这是一种默认值或空值。
它不会 return 我 5 即我将其设置为 return。
您需要使用It.IsAny<int>()
即
mock.Mock<ICommonServices>().Setup(x => x.AddTwoNumbers(It.IsAny<int>(),It.IsAny<int>())).Returns(5);
当模拟一个 returns 抽象的方法时,确保你调用 It.IsAny< YourType >() 的类型与您正在模拟的方法的参数类型。
给定一个将 IEnumerable 作为参数的方法:
interface IQueueItemRepository {
IQueueItem GetFirstNotIn(IEnumerable<Guid> guids)
}
在下面的示例中,.Setup 只会在 .GetFirstNotIn 被调用时被调用 集合 作为参数。
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());