gpt4 book ai didi

c# - 起订量。模拟委托(delegate)输入

转载 作者:太空狗 更新时间:2023-10-30 01:17:19 26 4
gpt4 key购买 nike

我正在尝试使用 Moq 模拟委托(delegate),但到目前为止我所做的一切都是徒劳的。我已经做了一个关于如何设置的小例子:

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

我想测试在带有输入 IFooBar 的委托(delegate) FooServiceDelegate 上定义的方法实际上被调用了,我也希望能够模拟响应通过委托(delegate)从 IFooBar 上的方法调用。

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

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

[TestClass()]
public class DoFooTests
{
[TestMethod, TestCategory("Unit")]
public void SayHelloJohn_ShouldUseServiceProxy()
{//SETUP
var serviceMock = new Mock<IFooBar>(MockBehavior.Loose);
var delegateMock = new Mock<ServiceProxy.FooServiceDelegate>(MockBehavior.Strict);
var serviceProxyMock = new Mock<IServiceProxy>(MockBehavior.Strict);
serviceProxyMock.Setup(m => m.FooService(delegateMock.Object));
var name = "John";
var response = $"Hello {name}";

//Im trying something like this (of course this does not work...)
delegateMock.Setup(m => m.Hello(name)).Returns(response);

//EXECUTE
var doFoo = new DoFoo(serviceProxyMock.Object);
var result = doFoo.SayHello(name);
//ASSERT
// Do some assertions here....
}
}

最佳答案

FooService 执行时,你必须调用委托(delegate):

[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 方法时。

关于c# - 起订量。模拟委托(delegate)输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32154043/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com