7

私の問題は、テスト中のクラスがそのプロパティを使用しているため、抽象クラスのプロパティをスタブ化したいということです。現在、最新バージョンのMoqを使用しています。

私の抽象クラスは次のようになります。

public abstract class BaseService
{
    protected IDrawingSystemUow Uow { get; set; }
}

そして、テスト中の私のクラスは次のようになります。

public class UserService : BaseService, IUserService
{
    public bool UserExists(Model model)
    {
        var user = this.Uow.Users.Find(model.Id);
        if(user == null) { return false; }

        reurn true;
    }
}

Uowプロパティをスタブする方法がわかりません。誰か手がかりはありますか?Uowそれとも、私のデザインは、テストでクラスのプロパティに移動する必要があるほど悪いですか?

4

2 に答える 2

11

現在の設定は、1つの単純な理由で機能しませんUow。プロパティはオーバーライドできず、Moqの仕事はこの時点で完了します。オーバーライドできず、モックできません

最も簡単な解決策は、そのプロパティをオーバーライド可能にすることです。基本クラス定義を次のように変更します。

public abstract class BaseService
{
    protected virtual IDrawingSystemUow Uow { get; set; }
}

これで、Moqの保護されたusing Moq.Protected機能を使用できます(これには、テストクラスに名前空間を含める必要があります)。

// at the top of the file
using Moq.Protected;

// ...

var drawingSystemStub = new Mock<IDrawingSystemUow>();
var testedClass = new Mock<UserService>();
testedClass 
  .Protected()
  .Setup<IDrawingSystemUow>("Uow")
  .Returns(drawingSystemStub.Object);

// setup drawingSystemStub as any other stub

// exercise test
var result = testedClass.Object.UserExists(...);
于 2012-09-16T21:34:04.707 に答える
0

あなたの場合、それはかなり簡単だと思います。あなたはただUow財産をあざけるのではなく、IDrawingSystemUowサービスをあざけるだけです。したがって、のモックを作成し、それをプロパティを介してIDrawingSystemUowのインスタンスに割り当ててから、テスト(メソッドなど)を実行できます。UserServiceUowUserExists

于 2012-09-17T07:30:07.897 に答える