2011-09-19 29 views
5

Tôi đang sử dụng .net 4 với C#, EntityFramework 4 và Moq 4. Tôi đang cố gắng giả lập UnitOfWork, một Kho lưu trữ và cuối cùng là một cuộc gọi phương thức.Trouble Mocking Lambda với Kho lưu trữ Unitofwork

Đây là mã Tôi gặp rắc rối với

 var unitOfWorkMock = new Mock<UnitOfWork>(); 
     var cFieldRepositoryMock = new Mock<IRepository<CField>>(); 

     System.Linq.Expressions.Expression<Func<CField, bool>> query = (x) => x.CID == c && x.FID == parentFID; 

     cFieldRepositoryMock.Setup(x => x.GetFirst(query)); 

Phương pháp Chữ ký cho GetFirst:

  T GetFirst(Expression<Func<T, bool>> query = null, 
     Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null); 

CField:

public class CField 
{ 
    public CField() 
    { 
     //do stuff 
    } 
    public int ID { get; set; } 
    public int FID { get; set; } 
    public int CID { get; set; } 
} 

Những gì tôi mong đợi xảy ra: tôi Tôi mong rằng tôi gọi phương thức GetFirst của cFieldRepositoryMock, nó sẽ là matc h biểu thức lambda tôi vượt qua trong biểu thức tôi đã xác định trong phần Thiết lập.

gì đang xảy ra: Tôi nhận được một lỗi biên dịch trên sự phân công Setup: "Một cây biểu thức không thể chứa một cuộc gọi hoặc gọi có sử dụng đối số tùy chọn"

tôi đang làm rõ điều gì sai, tôi chỉ cần không chắc chắn những gì. Bất kỳ lời khuyên nào được đánh giá cao, tôi khá mới để thử nghiệm đơn vị.

Cảm ơn! AFrieze

+0

bạn có thể đăng bài khai báo nếu CField và chữ ký phương thức của getfirst()? – David

+0

Xin chào David, tôi đã thêm thông tin được yêu cầu. Tôi không thể đăng toàn bộ lớp CField vì vậy tôi đã đăng các trường có liên quan với các loại chính xác và mức độ truy cập. – AFrieze

+2

Bạn đã thử thêm một đối số cho orderBy-Argument (với It.IsAny <...> hoặc null)? Tôi không biết chính xác nhưng tôi nghĩ rằng Moq đang sử dụng biểu thức chính nó và tôi nghĩ rằng bạn phải cung cấp * tất cả * Đối số ở đây. – Carsten

Trả lời

8

Các eror bạn nhận được có vẻ là thực sự là một limitation of expressions:

Để UnitTest cụ như thế này xem xét để sử dụng It.IsAny (như Carsten đã gợi ý):

cFieldRepositoryMock.Setup(x => x.GetFirst(query, It.IsAny<Func<IQueryable<CField>, IOrderedQueryable<CField>>>())); 
Các vấn đề liên quan