Mock.Verify 使用列表的当前值,而不是调用正在验证的方法时列表的值
Mock.Verify uses current value of list, not the value of the list when the method being verified was called
我有这样一种情况,我正在 运行 进行单元测试并调用 Verify
来断言使用非空列表作为参数调用了一个方法。被测试的方法调用方法末尾列表中的Clear()
。好像调用 Verify
时,它正在检查当前时间的列表状态,而不是调用我的函数时的状态。这是预期的行为吗?有什么方法可以让 Verify
在调用我的方法时使用列表的值?
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
using System.Linq;
using System.Collections.Generic;
namespace Tests
{
[TestClass]
public class UnitTest1
{
public interface IMyDependency
{
void ParseNumbers(List<int> numbers);
}
public class MyDependency : IMyDependency
{
public void ParseNumbers(List<int> numbers)
{
}
}
public class SystemUnderTest
{
private IMyDependency myDependency;
public SystemUnderTest(IMyDependency myDependency)
{
this.myDependency = myDependency;
}
public void DoSomething(List<int> numbers)
{
this.myDependency.ParseNumbers(numbers);
// This causes my test to fail because Verify thinks that ParseNumbers was called
// with an empty list as the parameter, even though the list was not empty when
// ParseNumbers was called
numbers.Clear();
}
}
[TestMethod]
public void TestMethod1()
{
var myDependency = new Mock<IMyDependency>();
var systemUnderTest = new SystemUnderTest(myDependency.Object);
systemUnderTest.DoSomething(new List<int> { 1, 2, 3 });
// This succeeds
myDependency.Verify(e => e.ParseNumbers(It.IsAny<List<int>>()), Times.Once);
// This fails
myDependency.Verify(e => e.ParseNumbers(It.Is<List<int>>(m => m.Count > 0)), Times.Once);
}
}
}
Is that the expected behavior
看起来该行为可能是一个错误。我建议向开发者提出问题。
and is there any way to have Verify use the value of the list at the time that my method was called?
进行设置Verifiable
[TestMethod]
public void TestMethod1() {
// Arrange
var myDependency = new Mock<IMyDependency>();
myDependency
.Setup(e => e.ParseNumbers(It.Is<List<int>>(m => m.Count > 0)))
.Verifiable(); //<-- MAKE SETUP VERIFIABLE
var systemUnderTest = new SystemUnderTest(myDependency.Object);
// Act
systemUnderTest.DoSomething(new List<int> { 1, 2, 3 });
// Assert
myDependency.Verify(); // Verifies that all verifiable expectations have been met.
}
我有这样一种情况,我正在 运行 进行单元测试并调用 Verify
来断言使用非空列表作为参数调用了一个方法。被测试的方法调用方法末尾列表中的Clear()
。好像调用 Verify
时,它正在检查当前时间的列表状态,而不是调用我的函数时的状态。这是预期的行为吗?有什么方法可以让 Verify
在调用我的方法时使用列表的值?
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
using System.Linq;
using System.Collections.Generic;
namespace Tests
{
[TestClass]
public class UnitTest1
{
public interface IMyDependency
{
void ParseNumbers(List<int> numbers);
}
public class MyDependency : IMyDependency
{
public void ParseNumbers(List<int> numbers)
{
}
}
public class SystemUnderTest
{
private IMyDependency myDependency;
public SystemUnderTest(IMyDependency myDependency)
{
this.myDependency = myDependency;
}
public void DoSomething(List<int> numbers)
{
this.myDependency.ParseNumbers(numbers);
// This causes my test to fail because Verify thinks that ParseNumbers was called
// with an empty list as the parameter, even though the list was not empty when
// ParseNumbers was called
numbers.Clear();
}
}
[TestMethod]
public void TestMethod1()
{
var myDependency = new Mock<IMyDependency>();
var systemUnderTest = new SystemUnderTest(myDependency.Object);
systemUnderTest.DoSomething(new List<int> { 1, 2, 3 });
// This succeeds
myDependency.Verify(e => e.ParseNumbers(It.IsAny<List<int>>()), Times.Once);
// This fails
myDependency.Verify(e => e.ParseNumbers(It.Is<List<int>>(m => m.Count > 0)), Times.Once);
}
}
}
Is that the expected behavior
看起来该行为可能是一个错误。我建议向开发者提出问题。
and is there any way to have Verify use the value of the list at the time that my method was called?
进行设置Verifiable
[TestMethod]
public void TestMethod1() {
// Arrange
var myDependency = new Mock<IMyDependency>();
myDependency
.Setup(e => e.ParseNumbers(It.Is<List<int>>(m => m.Count > 0)))
.Verifiable(); //<-- MAKE SETUP VERIFIABLE
var systemUnderTest = new SystemUnderTest(myDependency.Object);
// Act
systemUnderTest.DoSomething(new List<int> { 1, 2, 3 });
// Assert
myDependency.Verify(); // Verifies that all verifiable expectations have been met.
}