c# - 使用最小起订量模拟代表 "Wrapper"

标签 c# unit-testing moq

本质上,我有一个用于“安全”调用委托(delegate)的类。 “安全”本质上意味着如果某个成员已经被处置,则调用将被跳过。此类的代码:

    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");
}

我想做的是使用 moq 创建一个模拟,其行为方式与 FakeOperationInvoker 的行为方式相同。我怎样才能做到这一点?

最佳答案

难道你不能这样做吗:

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

关于c# - 使用最小起订量模拟代表 "Wrapper",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5393829/

相关文章:

C#:如何像在控制面板程序和功能中一样安装程序?

c# - 如果 linq 查询计数返回零,则返回值 1

c# - 一个窗口中的 WPF 应用程序

java - EasyMock.expect(...).times(...) 与多次使用 EasyMock.expect(...) 之间的区别?

c# - 使用 Rhino Mocks 默认返回空列表

c# - Moq 和 nUnit 测试 Entity Framework MVC 3 C#

c# - EF Code First 中的小数精度和小数位数

c - 使用指向 pthread_create 的函数指针会导致段错误

c# - 如何获取单元测试的数据模板?

c# - 对索引器属性使用 Moq 会导致 CaSTLe 出现 InvalidCastException