2

2 つの関数呼び出しが正しい順序で行われることを確認する単体テストが必要です。この例では、最初の関数はファイルを暗号化してファイル システムに保存し、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);
}
4

2 に答える 2

3

名前空間で試してください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にフィードバックを残してください。他の人にとってうまく機能しているというフィードバックがあれば、それをコア名前空間に昇格させることができます。

于 2013-04-19T09:28:34.867 に答える