2012-09-16 12 views
5

私の問題は、私の抽象クラスでテストするクラスがそのプロパティを使用するので、プロパティをスタブしたいということです。私は現在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プロパティにテストに私のクラスに移動する必要がありますか?

答えて

9

簡単な理由でUowプロパティが上書きされず、Moqのジョブがこの時点で完了しています。 Cannot override, cannot mock

最も簡単な解決策は、単にそのプロパティをオーバーライド可能にすることです。あなたが部品番号の保護機能(これはあなたのテストクラスでusing Moq.Protected名前空間を含めるする必要があります)を使用することができます

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

今:あなたのベースクラス定義がに変更し

// 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(...); 
+0

本当に助けてくれてありがとう!コードスニペットのマイナーなバグでした。返品(drawingSystemStub)は返品(drawingSystemStub.Object)に置き換えてください。 =) – Rikard

+0

@Rikard:ありがとう、修正されました。 –

+0

FYI @jimmy_keen - 「オーバーライドできません、模擬できません」のリンクが壊れています – lukejkw

0

を私はあなたの場合には、それはだと思いますかなり簡単。 Uowのプロパティを模倣するのではなく、IDrawingSystemUowサービスを模擬してください。したがって、IDrawingSystemUowというモックを作成し、Uowプロパティを使用してUserServiceのインスタンスに割り当ててから、テストを実行してください(例:UserExistsメソッド)。

関連する問題