c# - 使用 FakeItEasy 伪造 WCF 服务调用

标签 c# wcf fakeiteasy

我想测试我的类,它调用第三方 Web 服务。是否可以为此使用 FakeItEasy?

Wenn 我尝试从 Reference.cs(自动生成)中伪造类,UnitTest 已启动但不会返回。

Reference.cs(自动生成)

    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    public partial class ws_AccessoryClient : System.ServiceModel.ClientBase<AccessoryService.ws_Accessory>,
        AccessoryService.ws_Accessory
    {
        public ws_AccessoryClient()
        {
        }

        public ws_AccessoryClient(string endpointConfigurationName) :
            base(endpointConfigurationName)
        {
        }

        public AccessoryService.ResponseMessageOf_ListOf_SomeMethodInfo SomeMethod(
            AccessoryService.RequestMessageOf_SomeMethod request)
        {
            return base.Channel.SomeMethod(request);
        }
    }

测试.cs

    [Test]
    public void DoBusinessLogicTryTest()
    {
        var accessoryProxy = A.Fake<ws_AccessoryClient>();
    }

最佳答案

如前所述,您可能不想按照单元测试的目的进行操作,因为这会导致比使用模拟接口(interface)的单元测试所需的噪音更多。然而,这是一种有效的集成测试方法,这将允许您测试您的 WCF 接线是否按预期工作。如果您希望尽可能少地模拟,采用行为驱动的测试风格,它还允许您对应用程序进行整体测试。

我自己使用这种方法来使用 NSubstitute 旋转假端点这在我的博客中有介绍 Hosting a Mock as a WCF service .您需要做的主要事情是启动一个 ServiceHost ,给它你想要使用的端点地址,将上下文模式设置为单一并提供你想要用作端点的模拟。

var serviceHost = new ServiceHost(mock, new[] { baseAddress });

serviceHost.Description.Behaviors
    .Find<ServiceDebugBehavior>().IncludeExceptionDetailInFaults = true;
serviceHost.Description.Behaviors
    .Find<ServiceBehaviorAttribute>().InstanceContextMode = InstanceContextMode.Single;

serviceHost.AddServiceEndpoint(typeof(TMock), new BasicHttpBinding(), endpointAddress);

我在测试中做的一件事是随机选择我托管端点的端口,并在测试期间将地址注入(inject)我的应用程序。这样,您的测试将能够在其他机器上运行并构建服务器,而不会与正在使用的其他端口发生冲突。

看完您的示例后,您可能想考虑使用 WCF ChannelFactory创建您的客户端而不是使用具体的代理客户端类。 ChannelFactory 使用您提供的接口(interface)动态创建一个代理,并允许您使用服务接口(interface)将代理注入(inject)到它的依赖项中。这将使单元测试更容易,并为您提供更解耦的设计。

关于c# - 使用 FakeItEasy 伪造 WCF 服务调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40718598/

相关文章:

c# - WCF 服务中未定义的枚举值

unit-testing - FakeItEasy 断言失败,随机 <ignored> 参数(并且调用中存在匹配项)

c# - 如何使 FakeItEasy 伪造对象的方法在第一次调用时抛出并在第二次调用时返回?

c# - 如何使用 xUnit、SubSpec 和 FakeItEasy 测试抛出的异常

c# - Windows 服务中托管的 WCF basicHttpBinding 设置凭据

c# - 我如何在 C# 中将 void 指针转换为结构

xml - 为什么微软匹配一个XSD xs :integer to a string when importing WSDL?

c# - MongoDB C# 驱动程序 - $ 与相同字段匹配两次

c# - 指南针 UI 和指针

c# - 让 WCF 回调与 netTcpBinding 一起工作