Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 调用时Moq验证不匹配_Unit Testing_.net Core_Moq - Fatal编程技术网

Unit testing 调用时Moq验证不匹配

Unit testing 调用时Moq验证不匹配,unit-testing,.net-core,moq,Unit Testing,.net Core,Moq,在开始之前,我已经使用Moq在单元测试中模拟了很多年。这应该是一个简单的模拟验证,但无论出于何种原因,moq在发生时与模拟上的调用不匹配。我已经手动测试过了,它被击中了。我已经调试了测试并比较了实际值和预期值(它们匹配),我已经搜索了SO和它的许多人做了明显错误的事情,我不明白为什么这不起作用。谢谢你的帮助 单元测试是一个非常简单的测试,用于检查在void返回函数末尾是否调用了BulkInsert。示例代码: 代码: 公共接口IDependencyService { 无效舱壁插入(IList项目

在开始之前,我已经使用Moq在单元测试中模拟了很多年。这应该是一个简单的模拟验证,但无论出于何种原因,moq在发生时与模拟上的调用不匹配。我已经手动测试过了,它被击中了。我已经调试了测试并比较了实际值和预期值(它们匹配),我已经搜索了SO和它的许多人做了明显错误的事情,我不明白为什么这不起作用。谢谢你的帮助

单元测试是一个非常简单的测试,用于检查在
void
返回函数末尾是否调用了
BulkInsert
。示例代码:

代码:

公共接口IDependencyService
{
无效舱壁插入(IList项目);
}
公共类MyServiceClass
{
私有只读IDependencyService _服务;
/*还有那些爵士乐*/
公开募捐
{
/*对数据做些什么*/
_service.BulkInsert(items);//其中items是IList
}
}
测试:

公共类服务测试
{
[事实]
public void servicerrun_Calls_DependencyBulkInsert()
{
var dependencyMock=new Mock();
列出预期值=/*以某种方式生成预期值*/
依附锁
.Setup(mock=>mock.BulkInsert(It.IsAny());
var sut=newmyserviceclass(dependencyMock.Object);
sut.Run();
Verify(mock=>mock.BulkInsert(预期),Times.Once());
}
}
错误消息:

Expected invocation on the mock once, but was 0 times: mock => mock.BulkInsert([ThresholdCheck])
Performed invocations:

   Mock<IThresholdCheckHandler:1> (mock):

      IThresholdCheckHandler.GetQueuedChecks()
      IThresholdCheckHandler.BulkInsert([ThresholdCheck])
预期对mock调用一次,但为0次:mock=>mock.BulkInsert([ThresholdCheck])
执行的调用:
模拟(模拟):
IThresholdCheckHandler.GetQueuedChecks()的
IThresholdCheckHandler.BulkInsert([ThresholdCheck])
如果我在验证调用中将
expected
更改为
It.IsAny()
,则测试通过。这让我相信,从预期传递的对象可能与运行程序时生成的对象有所不同。然而,如上所述,我已经使用了调试器,并手动将实际列表中的每个值与测试中的预期值列表进行了比较,它们完全相同


这让我相信,我只是一只愚蠢的两足猴子,点击键盘,问题就在我面前,我只是看不见而已。感谢任何帮助或帮助。

根据NKosi的评论,
验证
通过操作。使用引用类型时引用。我很困惑,因为我过去用
Verify
来处理简单的事情,比如int和string,但我没有意识到这个怪癖。有人会假设它会检查实际值与预期值的等效性,但不会

不管怎样,根据Quercus的评论,为了继续我的一天,我调整了我的测试:

public class ServiceTests
{
    [Fact]
    public void ServiceRun_Calls_DependencyBulkInsert()
    {
        var dependencyMock = new Mock<IDependencyService>();
        List<T> actual = new List<T>();
        List<T> expected = /* somehow build expected values */
        dependencyMock
            .Setup(mock => mock.BulkInsert(It.IsAny<IList<T>>()))
            .Callback<List<T>>(l => actual = l);
        var sut = new MyServiceClass(dependencyMock.Object);
        
        sut.Run();

        actual.Should().BeEquivalentTo(expected);
    }
}
公共类服务测试
{
[事实]
public void servicerrun_Calls_DependencyBulkInsert()
{
var dependencyMock=new Mock();
列表实际值=新列表();
列出预期值=/*以某种方式生成预期值*/
依附锁
.Setup(mock=>mock.BulkInsert(It.IsAny()))
.回调(l=>actual=l);
var sut=newmyserviceclass(dependencyMock.Object);
sut.Run();
实际的.Should().beequivalento(预期的);
}
}

这个解决方案对我有效。感谢你们两位帮助我认识到我的错误。

除非预期的是传递给模拟成员的实际列表(引用),否则您描述的行为是经过设计的。好的,列表仅与自身相等,即使您的两个列表具有相同的元素,它们的“等于”将返回false。保留使用回调传递给mock方法的列表,然后将其与预期的进行比较。通过类似CollectionAssert.IsEqualAh的方式,好的,我不认为Verify是通过引用操作的,这很烦人。我真的不明白为什么它们会对引用而不是对象的相等性进行操作。感谢您的提醒,我将研究callback,因为您使用的是流畅的断言,您也可以在原始示例中执行
It.Is(actual=>actual.Should().beequivalento(expected))
Expected invocation on the mock once, but was 0 times: mock => mock.BulkInsert([ThresholdCheck])
Performed invocations:

   Mock<IThresholdCheckHandler:1> (mock):

      IThresholdCheckHandler.GetQueuedChecks()
      IThresholdCheckHandler.BulkInsert([ThresholdCheck])
public class ServiceTests
{
    [Fact]
    public void ServiceRun_Calls_DependencyBulkInsert()
    {
        var dependencyMock = new Mock<IDependencyService>();
        List<T> actual = new List<T>();
        List<T> expected = /* somehow build expected values */
        dependencyMock
            .Setup(mock => mock.BulkInsert(It.IsAny<IList<T>>()))
            .Callback<List<T>>(l => actual = l);
        var sut = new MyServiceClass(dependencyMock.Object);
        
        sut.Run();

        actual.Should().BeEquivalentTo(expected);
    }
}