2008-11-13 9 views
9

Tôi đang sử dụng mã này để xác minh một hành vi của một phương pháp Tôi đang thử nghiệm:Moq Expect On IRepository Đi qua biểu

_repository.Expect(f => f.FindAll(t => t.STATUS_CD == "A")) 
    .Returns(new List<JSOFile>()) 
    .AtMostOnce() 
    .Verifiable(); 

_repository được định nghĩa là:

private Mock<IRepository<JSOFile>> _repository; 

Khi thử nghiệm của tôi được điều hành, Tôi nhận được ngoại lệ này:

Biểu thức t => (t.STATUS_CD = "A") không được hỗ trợ.

Ai đó có thể vui lòng cho tôi biết cách tôi có thể kiểm tra hành vi này nếu tôi không thể chuyển biểu thức vào phương thức Mong đợi?

Cảm ơn !!

Trả lời

0

Trong tê giác Mocks bạn sẽ làm điều gì đó như thế này ...

Thay vì sử dụng Kỳ vọng, hãy sử dụng Sơ đồ và Bỏ qua đối số. Sau đó có -

Func<JSOFile, bool> _myDelegate; 

_repository.Stub(f => FindAll(null)).IgnoreArguments() 
    .Do((Func<Func<JSOFile, bool>, IEnumerable<JSOFile>>) (del => { _myDelegate = del; return new List<JSOFile>();}); 

Gọi Bất động Mã

* Thiết lập một đối tượng JSOFile giả với STATUS_CD thiết lập để "A" *

Assert.IsTrue(_myDelegate.Invoke(fakeJSO)); 
0

Hãy thử này

_repository.Expect(f => f.FindAll(It.Is<SomeType>(t => t.STATUS_CD == "A"))) 

Một cách dễ dàng để kiểm tra lỗi là đảm bảo rằng bạn sẽ kết thúc cuộc gọi mong đợi ays có ba ')' s.

+0

Phương thức trả về T. Phương thức FindAll lấy Func <...>, vì vậy điều này sẽ không hoạt động. –

0

Nếu bạn muốn kiểm tra các thông số chính xác được chuyển bạn có thể luôn luôn "lạm dụng" trở về tuyên bố:

bool correctParamters = true;

_repository.Expect (f => f.FindAll (It.IsAny>()))

.Returns ((Func func) => {correctParamters = func (fakeJSOFile); return new List-JSOFile-();})

.AtMostOnce()

.Verifiable();

Assert.IsTrue (correctParamters);

Điều này sẽ gọi hàm được chuyển với đối số bạn muốn.

2

Đây là một chút của một cách cheaty. Tôi làm một. ToString() trên các biểu thức và so sánh chúng. Điều này có nghĩa là bạn phải viết lambda theo cùng một cách trong lớp đang được kiểm tra. Nếu bạn muốn, bạn có thể thực hiện phân tích cú pháp tại thời điểm này

[Test] 
    public void MoqTests() 
    { 
     var mockedRepo = new Mock<IRepository<Meeting>>(); 
     mockedRepo.Setup(r => r.FindWhere(MatchLambda<Meeting>(m => m.ID == 500))).Returns(new List<Meeting>()); 
     Assert.IsNull(mockedRepo.Object.FindWhere(m => m.ID == 400)); 
     Assert.AreEqual(0, mockedRepo.Object.FindWhere(m => m.ID == 500).Count); 
    } 

    //I broke this out into a helper as its a bit ugly 
    Expression<Func<Meeting, bool>> MatchLambda<T>(Expression<Func<Meeting, bool>> exp) 
    { 
     return It.Is<Expression<Func<Meeting, bool>>>(e => e.ToString() == exp.ToString()); 
    }