首页 > 解决方案 > 为什么改变一个方法,而不是它的模拟,会导致测试行为的改变?

问题描述

我最近正在审查一个合同开发人员编写的一些代码,当我发现这个单元测试有一个不寻常的变化(它不完整 - 只发布相关代码)时,他现在离开了公司。

// Arrange
byte[] returnData = new byte[] { 2, 23, 56 };
this.mockCsvMemoryWriter.Setup(writer => writer.WriteCsvToMemory(It.IsAny<IEnumerable<AssetDetailsCsvModel>>())).Returns(returnData);

// Act
var actual = await this.target.GetAssetsDownload(null, null, ListViewModel.AssetStatus.Undefined);

// Assert
actual.ShouldSatisfyAllConditions(
    () => actual.ShouldBeAssignableTo<FileStreamResult>().ContentType.ShouldBe("text/csv"),
    () => actual.ShouldBeAssignableTo<FileStreamResult>().FileStream.ShouldNotBeNull(),
    () => actual.ShouldBeAssignableTo<FileStreamResult>().FileStream.Length.ShouldBeGreaterThan(0));

更改在最后一行,已更改为ShouldBeGreaterThanOrEqualTo(0).

奇怪的是,测试的目标,GetAssetsDownload方法没有改变。它的基础依赖项之一有,但它被模拟了 -writer.WriteCsvToMemory方法。

鉴于这是被嘲笑的,我不认为它的行为会改变。但确实如此。在更改之前,returnData字节按预期返回。通过更改,将返回一个空字节数组。

使用调试和断点,我已经验证了在这两种情况下,该方法都使用了模拟,并且没有调用GetAssetsDownload实际的方法。writer.WriteCsvToMemory

为什么在不更改模拟的情况下更改已模拟的方法会导致测试行为发生变化?

标签: c#unit-testingmoq

解决方案


推荐阅读