簡體   English   中英

c#:如何驗證按特定順序調用方法?

[英]c#: How can I verify methods are called in a certain order?

我有以下課程:

public class Script
{
    IPrinter _printer;

    public Script(IPrinter printer)
    {
        _printer = printer;
    }

    public void Print(TextWriter writer)
    {
        _printer.PrintComment(writer, "lolz");
        writer.WriteLine("omg this complicates things";
        _printer.PrintSpecial(writer);
        if (signoff)
            _printer.PrintComment(writer, "kthxbye");
    }
}

如何設置測試以聲明使用正確的參數以正確的順序調用打印機方法?

我可以手動創建一個'假'打印機並對編寫器進行狀態測試,但由於上下文很大(特別是因為腳本也在與編寫器一起使用),我想避免它。

我正在使用nunit和rhino模擬器。 任何關於體系結構更改的想法或模擬程序,以使這更容易測試,這是值得贊賞的。 不幸的是,我正在使用的真實代碼更復雜 - 但這是要點。

你不能使用靜態AAA語法來驗證Rhino中的行為,你不得不回到舊式“重播”來做AFAIK。

我不是犀牛專家,我通常使用Moq,但我認為這是正確的:

var mocks = new MockRepository();
var printer = mocks.DynamicMock<IPrinter>();
using (mocks.Ordered())
{
    printer.Expect(x => x.PrintComment());
    printer.Expect(x => x.PrintSpecial());
    printer.Expect(x => x.PrintComment());
}
printer.Replay();
Script = new Script(printer);

... Execute Test...

printer.VerifyAllExpectations();

您不應該測試調用哪些訂單方法。您應該進行測試以確保因調用Print方法而發生了正確的效果。

但是,如果你真的必須這樣做,我認為最好的方法是創建一個模擬IPrinter,它存儲調用的順序函數,以及傳遞的參數,然后可以在測試中斷言。

您不應該測試編譯器。 如果你正在做某種線程,我可以看到它...但在這種情況下,你發布的內容,你不是。

就像你說的那樣,你可以創建一個模擬打印機,並測試方法是按順序調用的,但它是多余的。

如果不調用前置條件(即先前的方法),則可能最好在特定方法中拋出異常,但這暗示需要對單個方法進行重構。

此外,您可以使用模板方法模式來確保按順序調用方法,但除非您將需要使用其他對象來使用該順序,否則它將是過度的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM