2010-12-13 11 views
2

私は過去1週間ほどMoqを使用していましたが、今日まで問題はありませんでした。 VerifyAll()を私のモックの設定と適切に一致させることに問題があります。Moqで設定が一致する際の問題

私は現在、アプリケーションのAPIの単体テストを書いています。私はサービスオブジェクトをからかった後、嘲笑サービスを使用してAPIオブジェクトを構築しています、これを考慮して

API <==> Service <==> DAO <==> Database

:ここでは、アプリケーションが構成されている方法です。私はすでにこれまで問題なく、いくつかの単体テストを書いてきました。

私はこのような2つのインスタンス変数があります。私は、セットアップの方法でこれらを初期化

private Api _api; 
private Mock<IHibernateService> mockService; 

を:ここで

[SetUp] 
public void DoSetupTasks() 
{ 
    mockService = new Mock<IHibernateService>(); 
    _api = new Api(mockService.Object); 
} 

が失敗しているユニットテストです:

[Test] 
    public void TestSearchOnAllProperties() 
    { 
     mockService 
      .Setup(service => service.LoadAll(It.IsAny<Type>())) 
      .Returns(new DomainBase[0]); 

     var dmbs = _api.SearchOnAllProperties("search term", typeof(DomainBase)); 

     mockService.VerifyAll(); 
    } 

APIのSearchOnAllProperties()メソッドは、その後、サービスのを呼び出しますメソッド(いくつかの付加的なロジックがあります)を使用しているので、適切に呼び出されていることを確認したいと思います。明確にするために、ここでLoadAll()SearchOnAllProperties()に呼び出されている方法は次のとおりです。私はユニットテストを実行すると

public IEnumerable<DomainBase> SearchOnAllProperties(string searchTerm, Type type) 
{ 
    foreach (DomainBase dmb in _hibernateService.LoadAll(type)) 
    { 
     // additional logic 
    } 
} 

しかし、私は与えられた設定が一致していなかったことを知らせるMockVerificationExceptionを取得します。なぜ私はサービスのLoadAll()メソッドを呼び出す必要があるのか​​分かりません。

答えて

0

この特定のテストメソッドが呼び出される前のある時点で、mockServiceが新しいインスタンスMock<IHibernateService>に割り当てられている可能性があります。その場合、このテストメソッドは間違ったインスタンスでSetupを呼び出すことになり、この例外が発生します。

これはローカルmockServiceapi変数を使用することで、テストはまだ失敗した場合に見ることをテストする簡単な方法:

[Test] 
public void TestSearchOnAllProperties() 
{ 
    var localMockService = new Mock<IHibernateService>(); 
    var localApi = new Api(localMockService.Object); 

    localMockService 
     .Setup(service => service.LoadAll(It.IsAny<Type>())) 
     .Returns(new DomainBase[0]); 

    var dmbs = localApi.SearchOnAllProperties("search term", typeof(DomainBase)); 

    localMockService.VerifyAll(); 
} 

HTH

+0

私はmockServiceと_APIを初期化しようとしたことを明らかにしている必要がありますテストケース内でローカルに実行され、問題は解決されません。 –

+0

@タイラー、私はあなたのコードをコピーし、それは合格したので、Moqの問題ではありません。あなたの 'Api'クラスは内部の' IHibernateService'変数を新しいインスタンスに割り当てることができる何かをしていますか? –

+0

これは、一致するメソッド呼び出しが別の式の一部である場合に問題になるようです: 'foreach(タイプt in _hibernateService.GetAllDomainTypes()。Where(t => t.BaseType!= null && t.BaseType.Name == "DomainBase" &&!t.IsAbstract) '。モックをstrictに設定しましたが、例外はありません。メソッドが全く呼び出されていないようです。 –

関連する問題