2009-07-30 5 views
6

Ho un metodo che imposta una proprietàRhino Mocks Assert proprietà Setter è stato chiamato con il corretto tipo di oggetto

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

come faccio a verificare che le credenziali è stato chiamato con un NetworkCredential valida?

Ho provato questo TestMethod ma fallisce perché gli oggetti NetworkCredential sono diversi riferimenti

[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)); 
} 

C'è un modo per verificare che il setter è stato richiamato con un oggetto di tipo NetworkCredential e con i parametri corretti?

risposta

15

ho riparato facendo il ReportService accettare un credenziali di rete al posto del nome utente, password, dominio

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

quindi il mio test è stato molto più facile

[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

Risposta eccellente, quindi questo codice funziona effettivamente verifica se il setter è stato chiamato con un valore dato: mock.AssertWasCalled (x => x.PropertyName = VALUE_WE_ARE_CHECKING); – Roboblob

3

Modifica: Ripensando a questo problema, la mia risposta suggerita precedente probabilmente non funzionerebbe. Ecco perché:

In sostanza, si sta tentando di verificare che la dipendenza di una dipendenza sia stata impostata correttamente. Questo è probabilmente il motivo per cui hai problemi a scrivere un test unitario per questo. Probabilmente vorrai considerare se avrebbe senso spostare il metodo SetNetworkCredential nella classe che implementa invece IReportExecutionService.

E se lo fai, il test di unità per quel metodo sarebbe abbastanza semplice:

[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

che sarebbe l'ideale per sicuro. Ma la classe che implementa IReportExecutionService è una classe generata dal codice (da WSDL a SSRS), ho estratto IReportExecutionService in modo che potessi prenderlo in giro. –