我想在这里伪造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?
我不知道该怎么做..
答案 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