2011-03-22 95 views
1

基本上,我有一个用于“安全”调用代表的类。 “安全”基本上意味着如果某个成员已经被处置,则该调用将被跳过。这个类的代码:使用Moq嘲笑代表“包装器”使用Moq

public class SafeOperationInvoker<TResponse> : IOperationInvoker<TResponse> 
    where TResponse : class 
    { 
    private readonly IDisposableResource _callbackOwner; 
    private readonly IOperationInvoker<TResponse> _next; 

    public SafeOperationInvoker(IDisposableResource callbackOwner, IOperationInvoker<TResponse> next) 
    { 
     _callbackOwner = callbackOwner; 
     _next = next; 
    } 

    public void Invoke(Action<TResponse> completedCallback) 
    { 
     //wrap the callback 
     _next.Invoke(response => SafeOperationCompleted(response, completedCallback)); 
    } 

    private void SafeOperationCompleted(TResponse response, Action<TResponse> completedCallback) 
    { 
     //only invoke the callback if not disposed 
     if (_callbackOwner != null && _callbackOwner.IsDisposed) 
     { 
      return; 
     } 
     completedCallback(response); 
    } 
} 

我想是测试SafeOperationCompleted方法 - 如果callbackOwner布置,该completedCallback不火(反之亦然)。

我创建手工假是正确的,使我的测试功能:

private class FakeOperationInvoker : IOperationInvoker<string> 
{ 
    public void Invoke(Action<string> completedCallback) 
    { 
     completedCallback("hi"); 
    } 
} 

测试:

[TestMethod] 
public void SafeOperationCompleted_OriginalCallback_Invoked() 
{ 
    int called = 0; 

    var mockOwner = new Mock<IDisposableResource>(); 
    mockOwner.Setup(m => m.IsDisposed).Returns(false); 
    var invoker = new SafeOperationInvoker<string>(mockOwner.Object, new FakeOperationInvoker()); 
    invoker.Invoke((o) => { called++;}); 
    Assert.AreEqual(1, called, "Original callback should have been called"); 
} 

我想要做的是使用最小起订量来创建行为进行模拟与FakeOperationInvoker的行为方式相同。我怎样才能做到这一点?

回答

4

你就不能这样做:

var operationInvoker = new Mock<IOperationInvoker<string>>(); 
operationInvoker.Setup(oi => oi.Invoke(It.IsAny<Action<string>>()) 
       .Callback((Action<string>> callback) => callback("hi"));