2009-07-30 8 views
6

プロパティを設定するメソッドがあります。Rhino Mock Assertプロパティセッターが正しいオブジェクトタイプで呼び出されました

public void SetNetworkCredential(string userName, string password, string domain) 
{ 
    _reportExecutionService.Credentials = new NetworkCredential(userName, password, domain); 
} 

有効なNetworkCredentialでCredentialsが呼び出されたことを確認するにはどうすればよいですか?

このTestMethodを試しましたが、NetworkCredentialオブジェクトが異なる参照であるために失敗しました

[TestMethod] 
public void TestTest() 
{ 
    const string userName = "userName"; 
    const string password = "password"; 
    const string domain = "domain"; 

    var mock = MockRepository.GenerateMock<IReportExecutionService>(); 
    var rptService= new ReportService(mock); 

    rptService.SetNetworkCredential(userName, password, domain); 

    mock.AssertWasCalled(x => x.Credentials = new System.Net.NetworkCredential(userName, password, domain)); 
} 

NetworkCredential型のオブジェクトと正しいパラメータでsetterが呼び出されたことを検証する方法はありますか?

答えて

15

私はReportServiceのではなく、ユーザー名、パスワードのネットワーク資格情報を受け入れることによって、それを修正し、ドメイン

public void SetNetworkCredential(NetworkCredential networkCredential) 
{ 
    _reportExecutionService.Credentials = networkCredential; 
} 

ので、私のテストは確かに理想的であろうと

[TestMethod] 
public void TestTest() 
{ 
    const string userName = "userName"; 
    const string password = "password"; 
    const string domain = "domain"; 

    var mock = MockRepository.GenerateMock<IReportExecutionService>(); 
    var rptService= new ReportService(mock); 

    var networkCredential = new System.Net.NetworkCredential(userName, password, domain); 

    rptService.SetNetworkCredential(networkCredential); 

    mock.AssertWasCalled(x => x.Credentials = networkCredential); 
} 
+0

優れた答えですので、このコードはsetterが指定された値で呼び出されたかどうかをテストします。 mock.AssertWasCalled(x => x.PropertyName = VALUE_WE_ARE_CHECKING); – Roboblob

3

編集:この問題を再考すると、私の以前の提案された回答はおそらくうまくいかないでしょう。理由は次のとおりです。

基本的に、依存関係の依存関係が正しく設定されているかどうかを確認しようとしています。それはおそらくあなたがこれのためのユニットテストを書く上で問題を抱えているのです。 SetNetworkCredentialメソッドを、代わりにIReportExecutionServiceを実装するクラスに移動することが理にかなっているかどうかを検討することをお勧めします。

そして、あなたがしなければ、そのメソッドのユニットテストは十分に単純になります:

[Test] 
public void TestSetNetworkCredential() 
{ 
    const string userName = "userName"; 
    const string password = "password"; 
    const string domain = "domain"; 

    var rptService= new ReportExecutionService(); 

    rptService.SetNetworkCredential(userName, password, domain); 
    Assert.AreEqual(userName, rptService.Credentials.UserName); 
    Assert.AreEqual(password, rptService.Credentials.Password); 
    Assert.AreEqual(domain, rptService.Credentials.Domain); 
} 
+0

はるかに簡単でした。しかし、IReportExecutionServiceを実装するクラスはコード生成クラス(WSDLからSSRSへ)であり、IReportExecutionServiceを抽出しました。 –

関連する問題