起订量。模拟委托输入

时间:2015-08-22 08:30:02

标签: c# unit-testing delegates mocking moq

我正在尝试使用Moq模拟一个委托,但到目前为止,我所做的一切都是徒劳的。 我举了一个小例子来说明设置:

1.代理类正在抽象WCF服务

public interface IServiceProxy
{
    void FooService(ServiceProxy.FooServiceDelegate service);
}

public class ServiceProxy : IServiceProxy
{
    private readonly EndpointAddress _fooServiceEndpoint;

    public ServiceProxy(IConfiguration configuration)
    {
        _fooServiceEndpoint = new EndpointAddress(new Uri(configuration.WcfServiceEndpoint));
    }

    public delegate void FooServiceDelegate(IFooBar proxy);


    public void FooService(FooServiceDelegate service)
    {
        Do<IFooBar>((service.Invoke), _fooServiceEndpoint);
    }


    private void Do<T>(UseServiceDelegate<T> f, EndpointAddress address)
    {
        UsingService<T>.Use(f.Invoke, address);
    }
}

2.服务定义

/// <summary>
/// This is the interface the WCF service exposes
/// </summary>
public interface IFooBar
{
    string Hello(string name);
}

3.使用代理的类

public class DoFoo
{
    private readonly IServiceProxy _serviceProxy;

    public DoFoo(IServiceProxy serviceProxy)
    {
        _serviceProxy = serviceProxy;
    }


    public string SayHello(string name)
    {
        var response = string.Empty;
        _serviceProxy.FooService(proxy => { response = proxy.Hello(name); });

        return response;
    }
}

我想测试在委托FooServiceDelegate上使用输入IFooBar定义的方法实际上已被调用,并且我希望能够通过{上的方法调用来模拟响应{1}}通过代表。

到目前为止,我的尝试都是徒劳的,所以我希望有一些moq专家可以在这里提供帮助。

这是一个测试的例子,当然不能像现在这样工作。

IFooBar

1 个答案:

答案 0 :(得分:4)

您必须在执行FooService时调用该委托:

[TestMethod]
public void SayHelloJohn_ShouldUseServiceProxy()
{
    const string EXPECTED_RESULT = "Hello John";
    const string NAME = "John";

    var fakeServiceProxy = new Mock<IServiceProxy>(MockBehavior.Strict);
    var fakeFooBar = new Mock<IFooBar>(MockBehavior.Loose);
    fakeFooBar.Setup(bar => bar.Hello(NAME)).Returns(EXPECTED_RESULT);

    fakeServiceProxy.Setup(proxy => proxy.FooService(
                    It.IsAny<ServiceProxy.FooServiceDelegate>()))
                    .Callback<ServiceProxy.FooServiceDelegate>(arg => arg(fakeFooBar.Object));

    var target = new DoFoo(fakeServiceProxy.Object);


    var result = target.SayHello(NAME);

    Assert.AreEqual(EXPECTED_RESULT, result);
}

当您调用proxy => { response = proxy.Hello(name); })方法时,上述代码段会执行SayHello