2009-07-30 27 views
6

Tôi có một phương pháp mà bộ một tài sảnRhino Mocks Khẳng định tài sản Setter được gọi với đúng đối tượng loại

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

làm thế nào để xác minh rằng Credentials được gọi với một NetworkCredential hợp lệ?

tôi đã cố gắng TestMethod này nhưng nó không thành công bởi vì các đối tượng NetworkCredential là tài liệu tham khảo khác nhau

[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ó cách nào để xác nhận rằng setter được gọi với một đối tượng kiểu NetworkCredential và với các thông số chính xác không?

Trả lời

15

tôi cố định nó bằng cách làm cho ReportService chấp nhận một Credential mạng thay vì tên người dùng, mật khẩu, miền

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

nên thử nghiệm của tôi là dễ dàng hơn

[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

Câu trả lời xuất sắc, do đó, mã này thực sự hoạt động, nó sẽ kiểm tra nếu setter được gọi với giá trị đã cho: mock.AssertWasCalled (x => x.PropertyName = VALUE_WE_ARE_CHECKING); – Roboblob

3

Chỉnh sửa: Xem xét lại vấn đề này, câu trả lời được đề xuất trước đây của tôi có thể không hoạt động. Đây là lý do:

Về cơ bản, bạn đang cố gắng xác minh rằng sự phụ thuộc của phụ thuộc đã được thiết lập chính xác. Đó có lẽ là lý do tại sao bạn gặp vấn đề khi viết một bài kiểm tra đơn vị cho việc này. Bạn có thể muốn cân nhắc xem bạn có muốn di chuyển phương thức SetNetworkCredential vào lớp thực hiện IReportExecutionService thay thế hay không.

Và nếu bạn làm thế, các đơn vị kiểm tra cho phương pháp đó sẽ là đủ đơn giản:

[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

Đó sẽ là lý tưởng cho chắc chắn hơn nhiều. Nhưng lớp thực hiện IReportExecutionService là một lớp được tạo mã (WSDL đến SSRS), tôi trích xuất IReportExecutionService để tôi có thể giả lập nó. –

Các vấn đề liên quan