2011-08-09 21 views
20

Sử dụng RhinoMocks, tôi đang cố gắng để Stub giá trị getter của một tài sản. Thuộc tính được định nghĩa là một phần của Giao diện chỉ có quyền truy cập getter.Đổ một tài sản có được sử dụng tê giác Mocks

Tuy nhiên tôi nhận được lỗi "Cuộc gọi không hợp lệ, cuộc gọi cuối cùng đã được sử dụng hoặc không có cuộc gọi nào được thực hiện (đảm bảo rằng bạn đang gọi phương thức ảo (C#)/Ghi đè (VB))." Tôi hiểu điều này có thể có nghĩa là tài sản tôi đang stubbing không phải là ảo; Tuy nhiên, nó là một phần của Giao diện và tôi không chắc liệu đó có phải là lý do tại sao tôi gặp phải lỗi này hay không ..

Dưới đây là bộ xương mã. Nếu tôi bỏ ghi chú dòng "stubRepository.Stub (x => x.StoreDeviceID) .PropertyBehavior();", thì tôi gặp lỗi mới "Thuộc tính phải được đọc/ghi". Tôi đã tìm kiếm trên SO và tìm thấy trang this. Nhưng giải pháp được đề xuất không giúp tôi. Có suy nghĩ gì không?

public interface IStore { 
     string StoreDeviceID {get;} 
     //other methods 
    } 

    public static class Store { 
     private IStore Repository; 

     public void SetRepository(IStore rep){ 
      Repository = rep; 
     } 

     public StoredeviceID { 
      get{ 
       return Repository.StoreDeviceID; 
      } 
     } 

     //other methods 
    } 

    public class TestClass { 
     [Test] 
     public void TestDeviceID() { 
      var stubRepository = 
       MockRepository.GenerateStub<IStore>(); 
      Store.SetRepository(stubRepository); 

      //stubRepository.Stub(x => x.StoreDeviceID).PropertyBehavior(); 
      SetupResult.For(stubRepository.StoreDeviceID).Return("test"); 

      Assert.AreSame(Store.StoreDeviceID, "test"); 
     } 
    } 

Trả lời

28

Do đây là một đọc tài sản duy nhất, bạn cần phải nói:

stubRepository.Stub(x => x.StoreDeviceID).Return("test"); 

Thông thường với cuống, tài sản được sử dụng như bình thường C# thuộc tính. Vì vậy, đối với tài sản không chỉ đọc, bạn sẽ nói: stubRepository.someProperty = "test";

Cũng lưu ý rằng nếu bạn muốn thiết lập một phương pháp cư xử một cách nào đó, cho dù đó là một mô hình hoặc một cuống, bạn sẽ luôn luôn nói:

stubRepository.Stub(x => x.someMethod()).Return("foo"); 

Hãy nhớ rằng, cuống đang có để cung cấp kiểm tra đơn vị của bạn với phụ thuộc cần thiết của họ, nhưng là không đó để chạy xác minh trên; đó là những gì mocks cho.

Sử dụng cuống khi bạn muốn cung cấp sự phụ thuộc hoạt động theo một cách nhất định. Sử dụng Mô hình khi bạn muốn xác minh rằng một số phụ thuộc nhất định đã được tương tác một cách chính xác.

Từ (nổi bật) Rhino Wiki:

A mock is an object that we can set expectations on, and which will verify that the expected actions have indeed occurred. A stub is an object that you use in order to pass to the code under test. You can setup expectations on it, so it would act in certain ways, but those expectations will never be verified. A stub's properties will automatically behave like normal properties, and you can't set expectations on them.

If you want to verify the behavior of the code under test, you will use a mock with the appropriate expectation, and verify that. If you want just to pass a value that may need to act in a certain way, but isn't the focus of this test, you will use a stub.

IMPORTANT: A stub will never cause a test to fail.

+0

@ Adam, Vì thuộc tính là chỉ đọc, tôi không thể đặt trên đó. Tuy nhiên, đoạn mã bạn cung cấp cho Stub thuộc tính hoạt động hoàn hảo. Silly tôi, tôi đã thử tất cả các tùy chọn khác ngoại trừ điều đó :) – Santhosh

+0

StoreDeviceID không có setter, vì vậy câu lệnh đầu tiên của bạn 'stubRepository.StoreDeviceID =" test ";' sẽ không hoạt động. –

+0

Ahh - xin lỗi. Tôi sẽ cập nhật câu trả lời của tôi - vui vì bạn đã làm nó mặc dù. –

4

Bạn có thể làm như sau với một cuống:

stubRepository.Stub(x => x.StoreDeviceID).Return("test"); 

Điều này sẽ gây ra nó để trở về "thử nghiệm" cho bất kỳ cuộc gọi đến getter StoreDeviceID của.

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