2011-09-14 14 views
10

Tiếp theo là chung chung của tôi giao diện kho lưu trữ cơ sởMoq Params TargetParameterCountException: Thông số đếm không phù hợp ngoại lệ

public interface IRepository<T> 
{ 
    IQueryable<T> AllIncluding(params Expression<Func<T, 
           object>>[] includeProperties); 
} 

thực thể của tôi

public class Sdk 
{ 
    public Sdk() 
    { 
     this.Identifier = Guid.NewGuid().ToString(); 
    } 

    public virtual ICollection<Resource> AccessibleResources { get; set; } 

    public string Identifier { get; set; }  
} 

và sau đây là repo cụ

public interface ISdkRepository : IRepository<Sdk> 
{ 
} 

bây giờ tôi cố gắng kiểm tra bộ điều khiển, sử dụng moq

Tiếp theo là mã tôi đang cố gắng để kiểm tra

public ActionResult GetResources(string clientId) { 
     var sdkObject = sdkRepository 
          .AllIncluding(k => k.AccessibleResources) 
          .SingleOrDefault(k => k.Identifier == clientId); 
     if (sdkObject == null) 
      throw new ApplicationException("Sdk Not Found"); 
     return Json(sdkObject.AccessibleResources.ToList()); 
    } 

sử dụng thử nghiệm sau

[Test] 
public void Can_Get_GetResources() 
{ 
    var cid = Guid.NewGuid().ToString(); 
    var mockRepo = new Moq.Mock<ISdkRepository>(); 
    var sdks = new HashSet<Sdk>() 
    { 
     new Sdk() 
     { 
      Identifier = cid, 
      AccessibleResources = new HashSet<Resource>() 
      { 
       new Resource() 
       { 
        Id = Guid.NewGuid(), 
        Description = "This is sdk" 
       } 
      } 
     } 
    }; 
    mockRepo.Setup(k => k. 
     AllIncluding(It.IsAny<Expression<Func<Sdk,object>>[]>())) 
         .Returns(sdks.AsQueryable); 
    var sdkCtrl = new SdksController(mockRepo.Object); 
    var returnedJson=sdkCtrl.GetResources(cid); 
    returnedJson.ToString(); 
} 

và nó được ném:

System.Reflection.TargetParameterCountException: Thông số đếm không phù hợp

Không biết tại sao?

+0

Can bạn dán Stack Trace? – Raghu

Trả lời

4

Tôi nghĩ bạn đã đạt được một số hạn chế ở đây với Moq. Nó không xử lý các tham số biểu thức tốt vì nó có thể được chuyển biểu thức dưới dạng các giá trị. Không có cách nào để Moq biết được phần nào của biểu thức được dự định sẽ được giải quyết và phần nào của chữ ký.

Ngoài ra, tôi không thể nhớ Moq xử lý params xx [] như thế nào nhưng bạn hoàn toàn có thể kết hợp hai vấn đề ở đây.

Bạn có thể tạo lớp hiển thị bộ biểu thức dưới dạng thuộc tính không? Nếu vậy, có thể thay đổi chữ ký của AllIncluding và yêu cầu Moq khớp với bất kỳ cá thể nào của lớp đó.

Cập nhật

Vào thời điểm trả lời này là một hạn chế nhưng bây giờ là có thể. Xem câu trả lời của Oleksandr Lytvyn

+0

hãy nhìn vào câu trả lời của Oleksandr Lytvyn. – Marcel

28

Mặc dù có một câu trả lời được đánh dấu là được chấp nhận, tôi tin rằng có một cách để giả lập kho lưu trữ của bạn một cách chính xác.

Thay vì

mockRepo.Setup(k => k.AllIncluding(It.IsAny<Expression<Func<Sdk, object>>[]>())) 
        .Returns(sdks.AsQueryable); 

xin vui lòng sử dụng

mockRepo.Setup(k => k.AllIncluding(It.IsAny<Expression<Func<Sdk, object>>[]>())) 
        .Returns((Expression<Func<Sdk, 
         object>>[] includeProperties) => sdks.AsQueryable()); 
+1

Nó đã lưu ngày của tôi) Tôi đã có chính xác cùng một vấn đề trong chính xác cùng một phương pháp, đề xuất của bạn hoạt động! –

+0

Cảm ơn bạn! đã cứu tôi nói về – trailmax

+0

Tuyệt vời! Đã làm việc. Có một lời giải thích cho cách nó hoạt động (những gì điều này thực sự không)? – Marcel

7

Một giải pháp khác để giải quyết vấn đề này là sử dụng: .AsQueryable() thay vì .AsQueryable.

0

Đối với những người khác đang tìm kiếm câu trả lời cho giải pháp này, tôi đã thêm cùng một số tham số trong Setup như trong biểu thức trong Returns.

Ví dụ:

Không làm việc với lập luận khác nhau đếm

mock.Setup(x => x.DoSomething(It.IsAny<string>(), It.IsAny<string>())) 
       .Returns((string s) => s.ToLower()); 

Làm việc với cùng một lượng args trong biểu trong Returns như trong Setup

mock.Setup(x => x.DoSomething(It.IsAny<string>())) 
       .Returns((string s1, string s2) => s1.ToLower()); 
Các vấn đề liên quan