如何解决Mock.Verify 使用列表的当前值,而不是调用被验证方法时列表的值
我有一种情况,我正在运行单元测试并调用 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);
}
}
}
解决方法
这是预期的行为
看起来这种行为可能是一个错误。我建议向开发者提出问题。
有没有办法让验证在调用我的方法时使用列表的值?
进行设置 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.
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。