2009-10-22 25 views
5

Tôi có một lớp học với một sự phụ thuộc:Làm thế nào để tôi lập một Func <T,TResult> trong Rhino Mocks?

private readonly IWcfClient<ITestConnectionService> _connectionClient; 

và tôi muốn còn sơ khai ra cuộc gọi này:

_connectionClient.RemoteCall(client => client.Execute("test")); 

này hiện không hoạt động:

_connectionService 
    .Stub(c => c.RemoteCall(rc => rc.Execute("test"))) 
    .Return(true); 

Đây có phải là có thể trong Rhino?

Trả lời

3

Sử dụng một tùy chỉnh làm đại biểu mà mất trong Func và kiểm tra đó. Bạn có thể làm điều đó bằng cách chuyển đổi nó thành một biểu thức và phân tích cú pháp cây biểu thức, hoặc chỉ chạy ủy nhiệm với đầu vào giả lập và kiểm tra kết quả.

Sau đây sẽ ném lỗi nếu lambda bên trong RemoteCall() không chứa x => x.Execute ("test") - bạn có thể làm việc với ý tưởng để làm cho chính xác những gì bạn muốn.

public interface IExecute { 
    void Execute(string input) 
} 
_connectionService 
    .Stub(c => c.RemoteCall(null)).IgnoreArguments() 
    .Do(new Func<Action<IExecute>,bool>(func => { 
     var stub = MockRepository.GenerateStub<IExecute>(); 
     func(stub); 
     stub.AssertWasCalled(x => x.Execute("test")); 
     return true; 
    }));; 
3

Nếu bạn không quan tâm đến giá trị chính xác của các thông số "test", bạn có thể sử dụng Arg<> xây dựng:

_connectionService.Stub(c => c.RemoteCall(Arg<Func<string, bool>>.Is.NotNull)) 
        .Return(true); 
Các vấn đề liên quan