2011-02-03 3 views
1

私はこのプロパティがサービスコールの戻り値から値を取得することをテストしようとしていますが、サービスコールを嘲笑することに問題があります。私は私のモックを本当のcountryServiceが呼び出されているので、エラーを取得しませ続けるRhino Mocks - プロパティ内でServiceへのメソッドコールをモックします

[TestMethod] 
    public void Country_should_return_Country_from_CountryService() 
    { 
     const string countryId = "US"; 
     _address.CountryId = countryId; 

     var address = MockRepository.GenerateStub<Address>(_address); 

     var country = MockRepository.GenerateMock<ICountry>(); 
     var countryService = MockRepository.GenerateStub<ICountryService>(); 

     countryService.Stub(x => x.GetCountryForCountryId(countryId)).IgnoreArguments().Return(country); 

     Assert.AreEqual(address.Country, country); 
    } 

:ここでは、このテストでの私の試みは

public ICountry Country 
    { 
     get 
     { 
      if (_country == null) 
      { 
       ICountryService countryService = new CountryService(); 
       _country = countryService.GetCountryForCountryId(_address.CountryId); 
      } 
      return _country; 
     } 
    } 

です:

は、ここに私の財産です。私はMsTestとRhino Mocksを使用しています。私は間違って何をしていますか?

答えて

6

問題は、プロパティが直接依存関係を構築していることです。このためモックサービスが呼び出されないため、実際の実際のCountryService実装が呼び出されています。

これを回避するには、他のオブジェクト(Address?)コンストラクタでCountryServiceファクトリ(またはサービス自体)のコンストラクタインジェクションを利用する方法があります。あなたが偽のCountryService(モック)が返されるために取得し、例えば方法

によって呼び出さいずれかになります。この方法:

private ICountryService _countryService; 

//constructor 
public OuterObject(ICountryService countryService) 
{ 
    //maybe guard clause 
    _countryService = countryService; 
} 


public ICountry Country 
{ 
    get 
    { 
     if (_country == null) 
     { 
      _country = _countryService.GetCountryForCountryId(_address.CountryId); 
     } 
     return _country; 
    } 
} 

あなたは、他のオブジェクトに嘲笑ICountryServiceに合格する必要がありますあなたの単体テストのコンストラクタ

+0

問題は、IStateプロパティを取得するためにStateサービスを呼び出していることです。他のものが存在する可能性があります。私は、オブジェクトを取得するために、これらのオブジェクトをクラスに渡すことに頼る必要はありませんでした。 – Martin

+2

あなたができることは、ObjectFactory.GetInstance ()またはobjectFactory.GetInstance ()...を行うことを可能にするObjectFactoryクラスを利用することです。この方法では、内部的には、ObjectFactoryは、IOCコンテナを使用することも、オブジェクトを構築するメカニズムを使用することもできます。ユニットテストのためにこれらの依存関係をスワップすることができるのであれば – saret

関連する問題