2012-02-24 27 views
13

Tôi đang thiết lập Mô hình như minh họa bên dưới. Nó được truyền vào hàm tạo của đích. Mục tiêu có một phương thức Decrypt được gọi hai lần trong vòng đời của mục tiêu. Mỗi lần phương thức Decrypt được gọi, nó loại bỏ chứng chỉ được "mới" trong Thiết lập. Tuy nhiên, khi gọi đối tượng Decrypt lần thứ hai, tôi nhận được một phương thức ObjectDisposed khi cố gắng giải mã. Nếu tôi thay thế Mock này bằng việc thực hiện Fake ICertificateHelperAdapter gọi GetCertificate(), thì cuộc gọi thứ hai tới Decrypt hoạt động đúng.Các cuộc gọi tiếp theo đến kết quả Mock.Setup trong cùng một cá thể đối tượng

Tôi suy ra rằng khi tôi sử dụng Mock, nó không trả lại cho tôi một phiên bản mới của đối tượng trong các cuộc gọi tiếp theo tới GetCertificate. Đây có phải là do thiết kế không?

private Mock<ICertificateHelperAdapter> GetCertificateHelperAdapter() 
    { 
     Mock<ICertificateHelperAdapter> certificateHelper = new Mock<ICertificateHelperAdapter>(); 

     certificateHelper.Setup(
      ch => ch.GetCertificate(CertStoreName.My, StoreLocation.LocalMachine, It.IsAny<string>())).Returns(this.GetCertificate()).Verifiable(); 
     return certificateHelper; 
    } 

    private X509Certificate2 GetCertificate() 
    { 
     return new X509Certificate2(Environment.CurrentDirectory + "\\" + "azureconfig.pfx", "dingos"); 
    } 

Trả lời

16

Các quá tải khác nhau của Returns<T> xử dirrently:

Một với T Returns<T>(T value) những gì bạn đang sử dụng luôn luôn trở về cùng một ví dụ.

Nhưng có phiên bản lười sử dụng Func<T>. Chúng trông giống như T Returns<T>(Func<T> value) và chúng sẽ đánh giá mỗi lần hàm paramter khi phương thức thiết lập được gọi.

mẫu từ Moq site:

// lazy evaluating return value 
mock.Setup(foo => foo.GetCount()).Returns(() => count); 

Thay đổi thiết lập của bạn để:

certificateHelper.Setup(ch => 
    ch.GetCertificate(CertStoreName.My, StoreLocation.LocalMachine, It.IsAny<string>())) 
.Returns(() => this.GetCertificate()).Verifiable(); //note the lambda in Returns 

Và nó sẽ gọi GetCertificate() của bạn hai lần.

+0

Điều này không hoạt động nếu tôi đang đặt Thuộc tính chứ không phải là phương pháp. – Raj

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