質問
Moqと学習は初めてです。
メソッドが期待される値を返すことをテストする必要があります。私は自分の問題を説明するために気楽な例をまとめました。 これは次のように惨めに失敗します:
<!> quot; ArgumentException:式はメソッド呼び出しではありません:c = <!> gt; (c.DoSomething(<!> quot; Jo <!> quot ;, <!> quot; Blog <!> quot ;, 1)= <!> quot; OK <!> quot;)<!> quot;
間違っていることを修正できますか?
[TestFixtureAttribute, CategoryAttribute("Customer")]
public class Can_test_a_customer
{
[TestAttribute]
public void Can_do_something()
{
var customerMock = new Mock<ICustomer>();
customerMock.Setup(c => c.DoSomething("Jo", "Blog", 1)).Returns("OK");
customerMock.Verify(c => c.DoSomething("Jo", "Blog", 1)=="OK");
}
}
public interface ICustomer
{
string DoSomething(string name, string surname, int age);
}
public class Customer : ICustomer
{
public string DoSomething(string name, string surname, int age)
{
return "OK";
}
}
簡単に言うと、上記のようなメソッドをテストしたいが、<!> quot; OK <!> quot;が返されることを期待していることがわかっている場合、Moqを使用してどのように記述しますか?
ご提案ありがとうございます。
解決
- モックオブジェクトと対話するテストサブジェクトが必要です(Moqの学習者テストを作成している場合を除きます)。以下に簡単なテストを作成しました
- モックオブジェクトに期待値を設定し、正確な引数を指定し(厳密-もちろん、必要に応じて
Is.Any<string>
を使用して任意の文字列を受け入れます)、戻り値を指定します - (テストのActステップの一部として)テスト対象者がモックを呼び出します
- 必要に応じて動作するテスト対象をアサートします。モックメソッドからの戻り値は、被験者によって使用されます-被験者のパブリックインターフェイスを介して検証します。
- また、指定したすべての期待値が満たされていることを確認します-呼び出されると予想されたすべてのメソッドが実際に呼び出されました。
。
[TestFixture]
public class Can_test_a_customer
{
[Test]
public void Can_do_something()
{
//arrange
var customerMock = new Moq.Mock<ICustomer>();
customerMock.Setup(c => c.DoSomething( Moq.It.Is<string>(name => name == "Jo"),
Moq.It.Is<string>(surname => surname == "Blog"),
Moq.It.Is<int>(age => age == 1)))
.Returns("OK");
//act
var result = TestSubject.QueryCustomer(customerMock.Object);
//assert
Assert.AreEqual("OK", result, "Should have got an 'OK' from the customer");
customerMock.VerifyAll();
}
}
class TestSubject
{
public static string QueryCustomer(ICustomer customer)
{
return customer.DoSomething("Jo", "Blog", 1);
}
}
他のヒント
Mock<T>.Verify
はメソッド呼び出しが返した値を返しません。そのため、<!> quot; == <!> quot;を使用して期待値と単に比較することはできません。
実際、 Verifyのオーバーロードはありません 、モックされたメソッドが特定の値を返すことを確認する必要がないためです。結局のところ、あなたはそもそもその値を返すように設定する責任がありました!モックされたメソッドの戻り値は、テストしているコードで使用するためにあります-モックをテストしていません。
Verifyを使用して、メソッドが予期した引数で呼び出されたこと、またはプロパティに予期した値が割り当てられたことを確認します。モックされたメソッドとプロパティの戻り値は、<!> quot; assert <!> quot;に到達するまでは重要ではありません。テストのフェーズ。
あなたはこの男がここでやっていたことと同じことをしている: クラス内の別のメソッドを確認する方法Moqを使用して呼び出されました
あなたはあなたがテストしているものをm笑しています。これは意味がありません。モックの使用は分離のためです。 Can_Do_Somethingテストは、常に合格します。どんなに。これは良いテストではありません。
GishuのテストまたはリンクされたSOの質問で提案したテストを詳しく見てください。