我正在尝试重构代码,以便可以使用fakexrmeasy进行单元测试。
作为所建议的here重构的一部分,我试图将IOrganizationService传递到我的所有类和方法中。但是,我的某些类使用IOrganizationService没有的变量和方法,例如Timeout。我正在尝试寻找一种重构方法以使用IOrganizationService而不丢失功能。
这是重构前的样子。
class testClass () {
public void testMethod(OrganizationServiceProxy service) {
service.Timeout = new TimeSpan(0, 15, 0);
}
}
这是在重构之后。 我尝试将IOrganizationService强制转换为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);
}
}
我已尝试使用this post中建议的IOrganizationServiceFactory。问题是factory.CreateOrganizationService()生成的是IOrganizationService,而不是OrganizationSeriviceProxy。
如何在不丢失功能的情况下重构使用IOrganizationService而不是OrganizationServiceProxy?我猜我可能必须以某种方式将IOrganizationService实现为OrganizationServiceProxy。
答案 0 :(得分:1)
两个选项:
1)为简单起见,请重构您的代码,使其仅引用IOrganizationService,并且仅在测试中使用该代码,并保留未经测试的TimeOut位(超出重构函数的范围)
2)如果必须非常确实地进行单元测试Timeout属性,请模拟您自己的OrganizationServiceContext类,并将FakeXrmEasy(IOrganizationService)生成的模拟服务传递给OrganizationServiceProxy的构造函数。这是所有可用的构造函数的列表:
答案 1 :(得分:0)
像这样可行吗?
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(后者又实现了IOrganizationService),因此您可以检查传入的对象是否实现了IServiceProxy接口,并在if中进行工作。
private void testMethod(IOrganizationService someService)
{
if(someService is IServiceProxy)
{
IServiceProxy tempProxy = someService as IServiceProxy;
tempProxy.Timeout = new TimeSpan();
}
}
答案 2 :(得分:0)
我不确定这是否有帮助,但这就是我所使用的
CrmServiceClient c = new CrmServiceClient(connectionstring); //various parameters available
(OrganizationServiceProxy) service = c.OrganizationWebProxyClient ?? c.OrganizationServiceProxy;
答案 3 :(得分:0)
我认为有一个简单的解决方案-如果您不需要在OrganizationServiceProxy
上模拟方法-只需在单元测试上下文中忽略这些方法即可。
I.E。代替
// This breaks when given a fake context
var serviceProxy = (OrganizationServiceProxy) service;
serviceProxy.Timeout = new TimeSpan(0, 15, 0);
做
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);
}