gpt4 book ai didi

unit-testing - 验证单元测试中的函数调用顺序

转载 作者:行者123 更新时间:2023-12-04 05:01:35 25 4
gpt4 key购买 nike

我想要一个单元测试来验证 2 个函数调用是否以正确的顺序发生。在示例中,第一个函数加密文件并将其保存到文件系统,第二个函数将加密的文件发送到第三方处理器(通过 FTP)。

我使用 NSubstitute 作为模拟框架,并使用 FluentAssertions 来帮助测试验证。这似乎不是您可以使用开箱即用的 NSubstitute 实现的目标。

public void SendUploadToProcessor(Stream stream, string filename)
{
var encryptedFilename = FilenameBuilder.BuildEncryptedFilename(filename);
FileEncrypter.Encrypt(stream, filename, encryptedFilename);
FileTransferProxy.SendUpload(encryptedFilename);
}

[TestMethod, TestCategory("BVT")]
public void TheEncryptedFileIsSent()
{
var stream = new MemoryStream();
var filename = Fixture.Create<string>();

var encryptedFilename = Fixture.Create<string>();
FilenameBuilder
.BuildEncryptedFilename(Arg.Any<string>())
.Returns(encryptedFilename);

Sut.SendUploadToProcessor(stream, filename);

// Something here to verify FileEncrypter.Encrypt() gets called first

FileTransferProxy
.Received()
.SendUpload(encryptedFilename);
}

最佳答案

尝试Received.InOrderNSubstitute.Experimental 命名空间中。

类似这样的东西(我还没有测试过):

Received.InOrder(() => {
FileEncrypter.Encrypt(stream, filename, encryptedFilename);
FileTransferProxy.SendUpload(encryptedFilename);
});

如果您不习惯依赖实验性功能,则需要设置回调来按顺序存储调用,然后对其进行断言。

var calls = new List<string>(); //or an enum for different calls
FileEncrypter.When(x => x.Encrypt(stream, filename, encryptedFilename))
.Do(x => calls.Add("encrypt"));
FileTransferProxy.When(x => x.SendUpload(encryptedFilename))
.Do(x => calls.Add("upload"));
// Act

// Assert calls contains "encrypt","upload" in the correct order

如果您最终尝试Received.InOrder,请在 discussion group 上留下一些反馈。如果我们得到一些关于它对其他人运行良好的反馈,那么我们可以将其提升到核心命名空间。

关于unit-testing - 验证单元测试中的函数调用顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16085428/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com