C# 如何重构方法以用IOrganizationService替换OrganizationServiceProxy
我正试图重构我的代码,这样我就可以使用fakexrmeasy进行单元测试 作为前面提到的建议重构的一部分,我尝试将iorOrganizationService传递到我的所有类和方法中。但是,我的一些类使用IOOrganizationService没有的变量和方法,例如Timeout。我正试图找到一种重构的方法,以便在不丢失功能的情况下使用IOrganizationService 这就是它在重构之前的存在方式C# 如何重构方法以用IOrganizationService替换OrganizationServiceProxy,c#,dynamics-crm,crm,fakexrmeasy,C#,Dynamics Crm,Crm,Fakexrmeasy,我正试图重构我的代码,这样我就可以使用fakexrmeasy进行单元测试 作为前面提到的建议重构的一部分,我尝试将iorOrganizationService传递到我的所有类和方法中。但是,我的一些类使用IOOrganizationService没有的变量和方法,例如Timeout。我正试图找到一种重构的方法,以便在不丢失功能的情况下使用IOrganizationService 这就是它在重构之前的存在方式 class testClass () { public void testMe
class testClass () {
public void testMethod(OrganizationServiceProxy service) {
service.Timeout = new TimeSpan(0, 15, 0);
}
}
这是在重构之后。
我已尝试将IOOrganizationService强制转换为OrganizationServiceProxy,但伪造的服务上下文无法处理此强制转换。将引发异常
class testClass () {
public void testMethod(IOrganizationService service) {
var serviceProxy = (OrganizationServiceProxy) service; //This breaks when given a fake context
service.Timeout = new TimeSpan(0, 15, 0);
}
}
我已尝试使用IOrganizationServiceFactory,如中所建议。问题是,factory.CreateOrganizationService()生成的是IOOrganizationService,而不是OrganizationSeriviceProxy
如何重构以使用IOOrganizationService而不是OrganizationServiceProxy而不丢失功能?我猜我可能不得不以某种方式将IOrganizationService实现为OrganizationServiceProxy。这样的方法可行吗
public class OrganizationServiceProxy : IServiceProxy
{
public int SomeProp
{
get
{
return 1;
}
set
{
}
}
public TimeSpan Timeout
{
get
{
return new TimeSpan();
}
set
{
}
}
public void SomeMethod()
{
}
}
public interface IServiceProxy : IOrganizationService
{
TimeSpan Timeout { get; set; }
}
public interface IOrganizationService
{
void SomeMethod();
int SomeProp { get; set; }
}
由于OrganizationServiceProxy实现了IServiceProxy(后者反过来实现了IOOrganizationService),您可以检查传入的对象是否实现了IServiceProxy接口,并在if中执行工作
private void testMethod(IOrganizationService someService)
{
if(someService is IServiceProxy)
{
IServiceProxy tempProxy = someService as IServiceProxy;
tempProxy.Timeout = new TimeSpan();
}
}
我不确定这是否有帮助,但这是我使用的
CrmServiceClient c = new CrmServiceClient(connectionstring); //various parameters available
(OrganizationServiceProxy) service = c.OrganizationWebProxyClient ?? c.OrganizationServiceProxy;
我认为有一个简单的解决方案-如果您不需要在
OrganizationServiceProxy
上模拟这些方法-只需忽略单元测试上下文中的方法
即代替
// This breaks when given a fake context
var serviceProxy = (OrganizationServiceProxy) service;
serviceProxy.Timeout = new TimeSpan(0, 15, 0);
做
两种选择:
1) 为了保持简单,重构代码,使其仅引用IOrOrganizationService,并且仅在测试中使用该代码,并保留未测试的超时位(在重构函数的范围之外)
2) 如果对Timeout属性进行单元测试确实是必要的,请模拟您自己的OrganizationServiceContext类,并将FakeXREasy(IOOrganizationService)生成的模拟服务传递给OrganizationServiceProxy的构造函数。以下是所有可用构造函数的列表:
var serviceProxy = service as (OrganizationServiceProxy);
// The serviceProxy is null so it is ignored when given a fake context
if (serviceProxy != null)
{
serviceProxy.Timeout = new TimeSpan(0, 15, 0);
}