2012-01-12 24 views
5

Tôi có, những gì tôi nghĩ, là một thiết lập khá thẳng về phía trước trong đó một loại tìm kiếm được tạo ra và chuyển qua một lớp dịch vụ và vào một kho lưu trữ nơi danh sách một kiểu miền được trả về. Loại tìm kiếm không làm gì ngoài việc xây dựng một cây biểu thức trong phương thức kho lưu trữ và về cơ bản các kết quả từ cơ sở dữ liệu trở lại. Khá đơn giảnKhi nào sử dụng gọi lại của Mock so với trả lại?

Giao diện kho:

public interface IDoNotSolicitRepo 
{ 
    IList<DNSContract> SelectWithCriteria(DNS_Search searchriteria); 
} 

Các dịch vụ triển khai kho:

public class DoNotSolicitService : BaseBLLService, IDoNotSolicitService 
{ 
    private readonly IDoNotSolicitRepo repo; 
    private readonly IPartnerService partnerService; 
    private readonly IDoNotSolicitReasonService dnsReasonSvc; 
    public DoNotSolicitService(IDoNotSolicitRepo _repo, IPartnerService _partnerSvc, IDoNotSolicitReasonService _dnsReasonSvc) 
    { 
     repo = _repo; 
     partnerService = _partnerSvc; 
     dnsReasonSvc = _dnsReasonSvc; 
    } 

    public ServiceResult<DNSContract> SelectWithCriteria(DNS_Search searchriteria) 
    { 
     var results = repo.SelectWithCriteria(searchriteria); 

     return ReturnServiceResult(results); 
    } 
} 

tôi đang làm việc trên học Moq với dự án này và tôi không thể hình dung ra nếu tôi m phải sử dụng gọi lại() hoặc trả về(). Tôi nhận được điểm tổng thể của cả hai, nhưng dường như không hoạt động đúng cho tôi vào lúc này.

Các thử nghiệm:

[Test] 
public void SelectWithCriteria_FirstName() 
{ 
    mockRepository.Setup(mr => mr.SelectWithCriteria(It.IsAny<DNS_Search>())) 
     .Returns((IList<DNSContract> records) => new List<DNSContract> 
                { 
                 new DNSContract {FirstName = "unit", LastName = "test"}, 
                 new DNSContract {FirstName = "moq", LastName = "setup"} 
                }); 

    dnsSvc = new DoNotSolicitService(mockRepository.Object, new PartnerServiceStub(), new DoNotSoicitReasonServiceStub()); 

    var result = dnsSvc.SelectWithCriteria(new DNS_Search { FirstName = "unit" }); 

    Assert.IsNotNull(result); 
    Assert.IsTrue(result.Data.Any()); 
} 

Lỗi:

System.ArgumentException was unhandled by user code 


Message=Object of type 'EP.Rest.Common.RestHelpers.DNS_Search' cannot be converted to type 'System.Collections.Generic.IList`1[EP.Rest.Domain.Contracts.DNSContract]'. 

Bây giờ, tôi đã đọc rằng Returns() phương thức trả về các loại thông qua tại, vì vậy tôi có thể thấy đó là nguyên nhân gây ra lỗi đó. Nhưng trong thế giới thực, tôi muốn loại khác được trả về. Tôi đã cố gắng để tạo ra một đại biểu gọi lại nhưng không ai trong số đó cảm thấy đúng.

+0

Trong nhìn này, có lẽ tôi đã vi phạm còn sơ khai v. V giả. Trách nhiệm giả khi những gì tôi muốn, nhưng tôi vẫn còn mờ trên Callback hoặc Return. – BryanGrimes

+0

Kiểm tra câu trả lời được chấp nhận cho [câu hỏi này] (http://stackoverflow.com/questions/2833162/moq-callback-can-you-help-to-understand-it), nên cung cấp cho bạn một ý tưởng khá hay. Ông cũng liên kết đến tài liệu cho Moq giải thích nó một chút tương lai. –

+0

@BryanGrimes, tôi đã đăng một ví dụ gọi lại về câu hỏi được tham chiếu, có thể điều này sẽ giúp ích. –

Trả lời

3

Chỉ cần thả các lambda trên .Returns ví dụ:

.Returns(new List<DNSContract>()); 

ban đầu của bạn là đi qua trong lập luận từ phương pháp của bạn để trở về để parameterize kết quả ví dụ như nếu kéo từ một nguồn có thể trả lại dữ liệu khác nhau tùy thuộc vào đầu vào.

Hoặc

.Returns<IList<DNSContract>>(new List<DNSContract>(){...}); 
+0

Bạn vừa lưu thị lực và sự tỉnh táo của tôi. Có vẻ như tôi vẫn sẽ phải tìm hiểu tại sao đó không thể là một cuộc gọi lại, nhưng bài kiểm tra của tôi hoạt động, cảm ơn. – BryanGrimes

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