2012-05-09 15 views
2

これは私のテストMOQ:抽象クラスの確認、保護メソッドが呼び出され

[TestClass] 
public class RepositoryTests 
{ 
    private APurchaseOrderRepository _repository; 

    [TestInitialize] 
    public void TestInitialize() 
    { 
     _repository = new FakePurchaseOrderRepository(); 
    } 

    [TestMethod] 
    public void RepositoryGetPurchaseOrdersForStoreCallsValidatePurchaseOrders() 
    { 
     var store = new Store(); 
     var mockRepo = new Mock<APurchaseOrderRepository>(); 
     mockRepo.Protected().Setup("ValidatePurchaseOrders", ItExpr.IsAny<List<PurchaseOrder>>()); 

     _repository.GetPurchaseOrders(store); 

     mockRepo.Protected().Verify("ValidatePurchaseOrders", Times.Once(), ItExpr.IsAny<List<PurchaseOrder>>()); 
    } 
} 

APurchaseOrderRepositoryであり、それがこの

public interface IPurchaseOrderRepository 
{ 
    List<PurchaseOrder> GetPurchaseOrders(Store store); 
} 

public abstract class APurchaseOrderRepository : IPurchaseOrderRepository 
{ 
    public abstract List<PurchaseOrder> GetPurchaseOrders(Store store); 

    protected virtual bool ValidatePurchaseOrders(List<PurchaseOrder> purchaseOrders) 
    { 
     return true; 
    } 
} 

ようなインターフェイスの外観です。しかし、私の

public class FakePurchaseOrderRepository : APurchaseOrderRepository 
{ 
    public override List<PurchaseOrder> GetPurchaseOrders(Store store) 
    { 
     var purchaseOrders = new List<PurchaseOrder>(); 

     ValidatePurchaseOrders(purchaseOrders); 

     return purchaseOrders; 
    } 
} 

フェイク

、私のテストは失敗します:

試験方法 PreSwapTests.RepositoryTests.RepositoryGetPurchaseOrdersForStoreCallsValidatePurchaseOrdersは例外をスロー:Moq.MockException:一度モック の期待呼び出しをするが、0回であった:モック=> mock.ValidatePurchaseOrders(It.IsAny())

設定された設定:mock => mock.ValidatePurchaseOrders(It.IsAny())、Times.Never No 呼び出しが実行されました。

私は間違っていますか?

注:

  • Moq.4.0.10827

更新:

私は2番目の引数として、それにパラメータを追加する必要があるので、それは、この行mockRepo.Protected().Setup("ValidatePurchaseOrders");だと思いますしかし、私はそれを正しいように見せることはできません。

更新2: いくつかの変更を加えましたが、コンパイルされましたが、正しくカウントされていません。エラーメッセージとコードは上記のとおりです。

答えて

1

は、これは私が考える今、はるかに優れた構造である。このテスト

[TestMethod] 
    public void RepositoryGetPurchaseOrdersForStoreCallsValidatePurchaseOrders() 
    { 
     var store = new Store(); 

     var mockPurchaseOrderProvider = new Mock<IPurchaseOrderProvider>(); 
     var mockPurchaseOrderValidator = new Mock<IPurchaseOrderValidator>(); 
     var purchaseOrderRepository = new PurchaseOrderRepository(mockPurchaseOrderProvider.Object, mockPurchaseOrderValidator.Object); 

     mockPurchaseOrderValidator.Setup(x => x.ValidatePurchaseOrders(It.IsAny<List<PurchaseOrder>>())); 

     purchaseOrderRepository.GetPurchaseOrders(store); 

     mockPurchaseOrderValidator.Verify(x => x.ValidatePurchaseOrders(It.IsAny<List<PurchaseOrder>>()), Times.Once()); 
    } 

で動作するように私のオブジェクトを変更しました。

0

ValidatePurchaseOrdersがあなたのIPurchaseOrderRepositoryインターフェイスにないためです。

リポジトリはprivate IPurchaseOrderRepository _repository;と宣言されているため、インターフェイスにあるものだけを見ることができます。私はすべて間違ってこれをやっていた実現

+0

プライベートAPurchaseOrderRepository _repository;に変更されました。同じエラー – CaffGeek

+0

ああ、それは保護されたメンバーだからです。どちらか公開するか、この質問が役立つかもしれません:http://stackoverflow.com/questions/3883835/verify-that-a-base-protected-method-is-called-with-moq-3-1 –

+0

私はそれを考えるこの行はmockRepo.Protected()。Setup( "ValidatePurchaseOrders");です。なぜなら、2番目の引数としてパラメータを追加する必要があるからですが、正しく取得できないようです。 – CaffGeek

関連する問題