この質問は、コンストラクターにパラメーターを持つクラスをモックする方法を示しています。これはの素晴らしいブロック投稿ですがMock.Of<>
、関数構文を使用してコンストラクターをモックする方法は示されていません。
public class MyClass
{
public MyClass(IDependency1 dep1, IDependency2 dep2, IDependency3 dep3)
{}
public ReturnType MyNewMethod(Tyep1 t1, Type2 t2)
{
//1. call to ExistingMethod1();
//2. call to ExistingMethod2();
//3. call using the DbContext
//4. call using the Logger
}
}
私は最初のブログ投稿に基づいてこのようなものを手に入れました。
var dep1 = new Mock<IDependency1>();
var dep2 = new Mock<IDependency2>();
var dep3 = new Mock<IDependency3>();
object[] arrParams = { dep1.Object, dep2.Object, dep3.Object }
var sut = new Mock<MyClass>(arrParams);
では、Mock.Of<>
構文を使用してコンストラクターにパラメーターを持つクラスをモックする方法は?
新しいメソッドは、既存のメソッドを呼び出すだけでなく、、、、およびDbContext
場合によってlogger
は他のサービスにもアクセスします。したがって、テストしている方法以外のすべてをモックする必要があります。
public class MyClass
{
public MyClass(MyDbContext context, ISecurityService secService, ILogger logger)
{}
public ReturnType1 ExistingMethod1(Type1 t1){}
public ReturnType2 ExistingMethod2(Type t){}
public MyEntity MyNewMethod(Tyep1 t1, Type2 t2)
{
//1. call to ExistingMethod1(); --> I'll just setup the return value
//2. call to ExistingMethod2(); --> I'll just setup the return value
//3. call using the DbContext --> ???
//4. call using the Logger --> ???
var x = ExistingMethod1(t1); //1.
var y = ExistingMethod1(x); //2.
var result context.MyEntities. //3.
.Where(e => e.id == y.MyEntityId)
.ToList();
return result;
}
}
Moqを使用したモックでは、メソッドを仮想化するためにクラスをモックする必要があります。そうでない場合は、任意のインターフェイスをモックできます。moqをモックしている場合、その場で動的な実装が作成されるため、実装に依存しません。あなたの場合、あなたはただすることができます
public class MyClass
{
public MyClass(IDependency1 dep1, IDependency2 dep2, IDependency3 dep3)
{}
public ReturnType MyNewMethod(Tyep1 t1, Type2 t2)
{
//1. call to ExistingMethod1(); --> I'll just setup the return value
//2. call to ExistingMethod2(); --> I'll just setup the return value
//3. call using the DbContext --> ???
//4. call using the Logger --> ???
}
}
Mock<MyClass> mockedObj = new Mock<MyClass>();
mockedObj.SetUp(x=>x.MyNewMethod()).Returns(objectOfReturnType);
ここでは、MyNewMethodを仮想化する必要があります。戻り値objectOfReturnTypeは、テストオブジェクトとして作成したオブジェクトです。したがって、メソッド本体の詳細は必要ありません。これがモックの考え方です。実際の実装を偽の実装(この場合はセットアップ)でモックします。テスト対象のクラスをテストする方法に応じて、さまざまな戻りオブジェクトを変更できます。最初にユニットテスト101を読むことをお勧めします。
MyNewMethodの動作を設定していることに注意してください。あなたの実装はたくさんのことをしているかもしれませんが、ここであなたが気にするのはそのリターンです。そのため、メソッドも仮想である必要があります。Moqによってオーバーライドされ、設定したものが返されます。内部的には、そのメソッドは異なるものを呼び出す可能性があります...だからあなたは気にしません
また、Moqの基本を読む必要があります。ここで見つけることができますhttps://github.com/Moq/moq4/wiki/Quickstart
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加