如何在C#中模拟SOAP Service类

时间:2017-06-07 06:48:32

标签: c# fakeiteasy

我想在这里伪造getCustomerName服务调用并使用伪数据

进行模拟

我的类是“CustomerName”,它调用SOAPService调用,返回CustomerNumber的CustomerName。我想伪造SOAPService调用以返回一些伪造的数据。

客户名称类:

using (WebService.WebServiceClient CustomerData = new WebService.WebServiceClient ())
{
      WebServiceClient.TestResponse resp = CustomerData.getCustomerName(customerNumber);
      resp.CustomerName;
}

我尝试过这些

var FakeWebService = A.Fake<WebServiceClient>();
var FakeCustomerName=A.Fake<CustomerName>();

然后我伪造了这里的Calls,假响应是一些价值

    A.CallTo(WebServiceClient.CustomerNumber).WithNonVoidReturnType().Returns(FakeResponse); 
fakeCustomerName = FakeCustomerData.GetCustomerName(CustomerNumber);

我面临的问题是它是从实际端点获取数据而不是fakedata?

我不知道该怎么做..

2 个答案:

答案 0 :(得分:1)

不是直接引用webservice,而是尝试模拟webservice本身,而是创建一个接口来保存webservice提供的功能。

public interface ICustomerData
{
    CustomerName GetCustomerName(CustomerNumber number);
}

然后,进行两个实现。一个调用实际的Web服务,一个可以用于测试:

public class CustomerData : ICustomerData
{
    CustomerName GetCustomerName(CustomerNumber number)
    {
        return CustomerData.GetCustomerName(number);
    }

    public CustomerData()
    {
        CustomerData = new WebService.WebServiceClient ();
    }
    private WebService.WebServiceClient CustomerData;
}


public class DelegatedCustomerData : ICustomerData
{
    public Func<CustomerNumber,CustomerName> GetCustomerName {get;set;}


    CustomerName ICustomerData.GetCustomerName(CustomerNumber number) => GetCustomerName(number);

}

后一个委托类只是如何模拟类的一个例子,但我个人更喜欢。

答案 1 :(得分:0)

您的方法存在一些问题。对于初学者,您只能伪造虚拟方法(或抽象的方法,或在接口上定义的方法)。我假设WebService.WebServiceClient.getCustomerName不是虚拟的,所以这里是@Micael答案的替代方案,可以帮助你解决这个问题。我过去曾多次使用过它:

像Micael所说,创建一个接口,它保存了web服务提供的功能。

public interface ICustomerData
{
    CustomerName GetCustomerName(CustomerNumber number);
}

然后你可以像他一样制作你的制作合作者CustomerData,或者如果WebService.WebServiceClient没有封存,你可以这样做:

public class CustomerData: WebService.WebServiceClient, ICustomerData
{}

您需要找到一种方法来为您的生产代码提供ICustomerData的实现,以便您可以在生产过程中使用实际的实现,并在测试期间使用假的,我现在谈论:

第二个问题是,在你的测试中,你试图伪造对WebServiceClient.CustomerNumber的调用,这对我来说是一种类型,而不是你正在处理的实际对象。继上面的步骤之后,您想伪造ICustomerData界面:

var fakeCustomerData = A.Fake<ICustomerData>();
var someCustomerName = getACustomerNameSomehow();

A.CallTo(() => fakeCustomerData.GetCustomerName(A<CustomerNumber>.Ignored)
        .Returns(someCustomerName);

每当调用someCustomerName时,这将确保您的假返回GetCustomerName。我将someCustomerName改为假,因为你可能不需要它是假的 - 如果很容易创建一个CustomerName对象从你的虚假服务返回,我就是这么做的。只有当你需要改变它的行为,或者几乎不可能创造它时,我才会使用假货。

配置假冒后,你应该在你的生产类上调用一些方法(你称之为CustomerName,就像从GetCustomerName返回的类型?),最终会调用{ {1}}合作者。在您的原始代码中,您直接在伪造的方法上调用一个方法,它只测试假的,而不是您自己的代码。所以你可能会有像

这样的东西
ICustomerData