我最近正在审查由合同开发人员编写的一些代码,当我发现此单元测试发生不寻常的更改时(该代码不完整-仅发布了相关代码),现在他们离开了公司。
// 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
方法。
为什么在不更改模拟的情况下更改被模拟的方法会导致测试行为发生变化?