2009-12-03 6 views
8

テストの結果、正しいパラメータで特定のメソッドが呼び出されたことをどのようにテストできますか?私はNUnitを使用しています。特定のメソッドがNUnitを使用して呼び出されたことをどのようにアサーションすることができますか?

このメソッドは何も返しません。それは単にファイルに書き込むだけです。私はSystem.IO.Fileのモックオブジェクトを使用しています。だから私は関数が呼ばれたかどうかをテストしたい。

答えて

10

さらなるコンテキストが必要です。だから私は、ミックスに部品番号を追加し、ここで1を入れます:

pubilc class Calc { 
    public int DoubleIt(string a) { 
     return ToInt(a)*2; 
    } 

    public virtual int ToInt(string s) { 
     return int.Parse(s); 
    } 
} 

// The test: 
var mock = new Mock<Calc>(); 
string parameterPassed = null; 
mock.Setup(c => x.ToInt(It.Is.Any<int>())).Returns(3).Callback(s => parameterPassed = s); 

mock.Object.DoubleIt("3"); 
Assert.AreEqual("3", parameterPassed); 
+0

Calcが抽象的なものでもインタフェースでもない場合、これは機能しますか?私が知っている限りでは、Moqは、これを可能にするために新しいIL命令を生成しないモックを作るために動的なプロキシを作成します... – kuskmen

11

あなたは、このようなTypemockRhino Mocks、またはNMocks2として、いくつかのモックフレームワークを使用する必要があります。

NUnitもNunit.Mockですが、よく知られていません。

MOQの構文はhereを見つけることができます:

また
var mock = new Mock<ILoveThisFramework>(); 

// WOW! No record/reply weirdness?! :) 
mock.Setup(framework => framework.DownloadExists("2.0.0.0")) 
    .Returns(true) 
    .AtMostOnce(); 

// Hand mock.Object as a collaborator and exercise it, 
// like calling methods on it... 
ILoveThisFramework lovable = mock.Object; 
bool download = lovable.DownloadExists("2.0.0.0"); 

// Verify that the given method was indeed called with the expected value 
mock.Verify(framework => framework.DownloadExists("2.0.0.0")); 

、あなただけインタフェースを模擬することができますので、System.IO.Fileから、あなたのオブジェクトがインタフェースを持っていない場合は、おそらくあなたは「できることに注意してください行う。仕事のための独自のカスタムクラスの中でSystem.IO.Fileにあなたの呼び出しをラップする必要があります。

+2

NUnitはテストを実行しますが、モックや検証は行いません。異なる責任。私はMoqを使用していませんが、モックオブジェクトの期待値を検証できるはずです。 – kyoryu

+0

うん、私は間違った場所を見ていた...私はnunitを見ていた。今私はmoqを見ている。 :) –

+0

MOQでは抽象クラスもモックできます。 –

3

インターフェイスのモックを使用します。

Finderというインターフェイスを使用するクラスImplClassがあり、Search関数が引数「hello」で呼び出されることを確認したいとします。

ので、我々は持っている:

FinderMock mock = new FinderMock("hello"); 
ImplClass impl = new ImplClass(mock); 
impl.doStuff(); 
Assert.AreEqual(1, mock.numTimesCalled); 

public interface Finder 
{ 
    public string Search(string arg); 
} 

public class ImplClass 
{ 
    public ImplClass(Finder finder) 
    { 
    ... 
    } 
    public void doStuff(); 
} 

を次に、あなたは、テストコードをテストコード

private class FinderMock : Finder 
{ 
    public int numTimesCalled = 0; 
    string expected; 
    public FinderMock(string expected) 
    { 
    this.expected = expected; 
    } 
    public string Search(string arg) 
    { 
    numTimesCalled++; 
    Assert.AreEqual(expected, arg); 
    } 
} 

のモックを作成することができます

2

ここAssertWasCalled

と呼ばれる方法が

var mailDeliveryManager = MockRepository.GenerateMock<IMailDeliveryManager>(); 
 

 
var mailHandler = new PlannedSending.Business.Handlers.MailHandler(mailDeliveryManager); 
 

 
mailHandler.NotifyPrinting(User, Info); 
 

 
mailDeliveryManager.AssertWasCalled(x => x.SendMailMessage(null, null, null), o => o.IgnoreArguments());

それを使用する方法ですRhinoのモックで