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 验证单元测试中的函数调用顺序_Unit Testing_Nsubstitute_Fluent Assertions - Fatal编程技术网

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

Unit testing 验证单元测试中的函数调用顺序,unit-testing,nsubstitute,fluent-assertions,Unit Testing,Nsubstitute,Fluent Assertions,我需要一个单元测试来验证2个函数调用是否按正确的顺序发生。在本例中,第一个函数加密文件并将其保存到文件系统,第二个函数将加密文件发送到第三方处理器(通过FTP) 我使用NSubstitute作为模拟框架和FluentAssertions来帮助测试验证。这似乎不是您可以通过NSubstitute开箱即用实现的 public void SendUploadToProcessor(Stream stream, string filename) { var encryptedFilename =

我需要一个单元测试来验证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);
}
public void SendUploadToProcessor(流,字符串文件名)
{
var encryptedFilename=FilenameBuilder.BuildEncryptedFilename(文件名);
加密(流,文件名,encryptedFilename);
FileTransferProxy.SendUpload(encryptedFilename);
}
[测试方法,测试类别(“BVT”)]
公开作废加密文件()
{
var stream=newmemoryStream();
var filename=Fixture.Create();
var encryptedFilename=Fixture.Create();
文件名生成器
.BuildEncryptedFilename(Arg.Any())
.返回(encryptedFilename);
SendUploadToProcessor(流,文件名);
//这里有一些验证FileEncrypter.Encrypt()是否首先被调用的内容
FileTransferProxy
.收到()
.SendUpload(encryptedFilename);
}
尝试使用
NSubstitute.Experimental
名称空间

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

如果您不习惯依赖实验性功能,则需要设置回调以按顺序存储调用,然后在此基础上断言

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
var calls=newlist()//或不同调用的枚举
FileEncrypter.When(x=>x.Encrypt(流、文件名、encryptedFilename))
.Do(x=>calls.Add(“加密”);
FileTransferProxy.When(x=>x.SendUpload(encryptedFilename))
.Do(x=>calls.Add(“上传”);
//表演
//断言调用按正确顺序包含“加密”、“上载”

如果您最终尝试接收到
。请在上留下一些反馈。如果我们得到一些反馈,认为它对其他人很有效,那么我们可以将它提升到核心名称空间。

虽然这不是一个答案,但作为单元测试的一部分验证显式顺序是不好的做法。您不应该测试实现细节。只需确保输入正确转换为输出,并添加一些基本上证明预期行为的替代方案。这就是为什么Rhinomock中不推荐此功能,而FakeiTasy甚至不支持它的确切原因。

谢谢David。我已经忘记了何时构造,这就是我要寻找的。NuGet包中没有NSubstitute.Experiative命名空间,如何获得包含该命名空间的NSubstitute版本?NuGet版本有它(它不是单独的DLL,只需使用
使用NSubstitute.Experiative
)。它是在v1.5.0(当前版本是v1.6.0)中引入的。我最初尝试输入using语句,但由于某种原因,它没有被识别。它现在正在工作。我给讨论小组留下了一些反馈。谢谢FakeiTesy支持有序断言:。我同意在可能的情况下应该避免使用它,但在某些情况下它是有用的。实用单元测试这本书包括时间(事情发生的顺序),因为它是一个非常有效的规范,例如“在调用save之前需要调用某个验证器。”或者,在这种情况下,“上传前需要调用加密程序。“。否则,您将如何确保在对其依赖项调用void方法的方法中使用此类规范?确保上传的结果被加密不是更好的测试吗?我同意@RyanTheLeach。你只能断言可观察的结果。即正确的输出或某些异常。不要测试内部构件。这将导致脆弱的单元测试。
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