2012-02-03 21 views
57

C#の単体テストやMoqの使用方法を学ぶのはかなり新しいです。以下は私がテストしようとしているクラスです。以下はMoqを使用してメソッド呼び出しを確認する

class MyClass 
{ 
    SomeClass someClass; 
    public MyClass(SomeClass someClass) 
    { 
     this.someClass = someClass;  
    } 

    public void MyMethod(string method) 
    { 
     method = "test" 
     someClass.DoSomething(method); 
    } 
} 

class Someclass 
{ 
    public DoSomething(string method) 
    { 
     // do something... 
    } 
} 

私のTestClassをされています。私は次の例外を取得

class MyClassTest 
{ 
    [TestMethod()] 
    public void MyMethodTest() 
    { 
     string action="test"; 
     Mock<SomeClass> mockSomeClass = new Mock<SomeClass>(); 
     mockSomeClass.SetUp(a => a.DoSomething(action)); 
     MyClass myClass = new MyClass(mockSomeClass.Object); 
     myClass.MyMethod(action); 
     mockSomeClass.Verify(v => v.DoSomething(It.IsAny<string>())); 
    } 
} 

Expected invocation on the mock at least once, but was never performed 
No setups configured. 
No invocations performed.. 

は、私はちょうど方法 "MyMethodはは" と呼ばれるかされているかどうかを確認します。何か不足していますか?

ありがとうございます!

+1

'SomeClass'に' MyMethod(string) 'の定義がないとコンパイルされません。 –

+0

申し訳ありません。私の質問を編集しました。 – user591410

+1

あなたは正しい道ですが、投稿されたコードにバグがあります。それはコンパイルされません - Someclassのケーシング、DoSomethingの無効な戻り値。その後、パブリックアクセスが必要となり、次にDoSomethingを仮想化します。つまり、プロダクションコードにもバグがあります。 – TrueWill

答えて

81

あなたは間違った方法をチェックしています。 Moqでは、依存関係クラス内のメソッドをセットアップし、必要に応じて検証しなければなりません。

あなたはより多くのこのような何かをやっている必要があります。

class MyClassTest 
{ 
    [TestMethod] 
    public void MyMethodTest() 
    { 
     string action = "test"; 
     Mock<SomeClass> mockSomeClass = new Mock<SomeClass>(); 

     mockSomeClass.Setup(mock => mock.DoSomething()); 

     MyClass myClass = new MyClass(mockSomeClass.Object); 
     myClass.MyMethod(action); 

     // Explicitly verify each expectation... 
     mockSomeClass.Verify(mock => mock.DoSomething(), Times.Once()); 

     // ...or verify everything. 
     // mockSomeClass.VerifyAll(); 
    } 
} 

言い換えれば、あなたはMyClass#MyMethodを呼び出して、あなたのクラスは間違いなく、そのプロセスに一度SomeClass#DoSomethingを呼び出すことを確認しています。引数Timesは必要ありません。私はその価値を実証していました。

+0

申し訳ありませんが、正しい方法で質問を編集しました。あなたが言及したように、私はSetUpを最初に試してからVerifyを実行しました。それでも私には同じ例外が与えられます。 – user591410

+0

私の質問は、あなたが作った提案で更新しましたが、これでも私には同じ例外が与えられます。助言してください。 – user591410

+0

私はそれを設定している間違ったメソッドの引数を設定していた。 – user591410

関連する問題