MOQモッククラスで予想されるパラメーター値を確認するために検証を使用する
-
29-10-2019 - |
質問
モック内のメソッドが予想されるオブジェクトパラメーターで呼び出されることを確認しようとしています。私はMOQ、Nunitを使用しており、Autofixtureの肖像は仕事を成し遂げるべきだと考えています。以下は、私がやろうとしていることの単純化されたバージョンです。
Autofixtureでこれを行う方法はありますか?それを検証するより良い方法はありますか? Something
適切なパラメーターで呼び出されますか?
オーバーライドはに等しくなります A
プロパティ値を比較して変更するクラス Verify
ラインへ:
barMock.Verify(m => m.Something(a));
パスですが、プロジェクトのようにすべてのクラスで等しく上書きすることはありません。
namespace Test
{
using Moq;
using NUnit.Framework;
using Ploeh.SemanticComparison.Fluent;
public class A
{
public int P1 { get; set; }
}
public interface IBar
{
void Something(A a);
}
public class Foo
{
public A Data { get; private set; }
public void DoSomethingWith(IBar bar)
{
Data = new A { P1 = 1 };
bar.Something(Data);
}
}
[TestFixture]
public class AutoFixtureTest
{
[Test]
public void TestSample()
{
var foo = new Foo();
var barMock = new Mock<IBar>();
var a = new A { P1 = 1 };
var expectedA = a.AsSource().OfLikeness<A>();
foo.DoSomethingWith(barMock.Object);
expectedA.ShouldEqual(foo.Data); // passes
barMock.Verify(m => m.Something(expectedA.Value)); // fails
}
}
}
解決
の中に Verify
MOQはデフォルトで引数の参照平等をチェックするので、同じインスタンスを提供するときにのみ合格します(オーバーライデンの場合を除きます Equals
)テストと実装で。
あなたの場合 expectedA.Value
を返します new A { P1 = 1 }
もちろん、テストで作成されたのは、で作成されたインスタンスと同じではありません DoSomethingWith
.
MOQを使用する必要があります It.Is
オーバーライドせずにこれを適切にテストするために構築します Equals
(実際、このためには、自動フィクストールはまったく必要ありません):
barMock.Verify(m => m.Something(It.Is<A>(arg => arg.P1 == a.P1)));
ただし、P1、P2、P3などの複数のプロパティがある場合...自動フィクストールは役立ちます。
barMock.Verify(m => m.Something(It.Is<A>(arg => expectedA.Equals(a))));
すべてのプロパティに対して手動でequulityチェックを書き出す必要がないためです。
他のヒント
Autofixture 2.9.1(または新しい)にアップグレードすると、宛先タイプのダイナミックプロキシを発する肖像画インスタンスのCreateProxyメソッドを呼び出すことができます。
生成された動的プロキシオーバーライドは、肖像を使用して等しくなり、構文を簡素化します(かなり多く)。
ここに、類似性プロキシを使用するように変更された元のテスト方法があります。
[Test]
public void TestSample()
{
var foo = new Foo();
var barMock = new Mock<IBar>();
var expected = new A().AsSource().OfLikeness<A>().CreateProxy();
expected.P1 = 1;
foo.DoSomethingWith(barMock.Object);
Assert.True(expected.Equals(foo.Data)); // passes
barMock.Verify(m => m.Something(expected)); // passes
}
また、テストアサーションを受け入れるよりもはるかに具体的にすることに注意してください どれでも 実例。
この新機能の詳細をご覧ください ここ.