我正在尝试重构我的代码,这样我就可以使用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。
发布于 2020-01-28 21:10:57
有两个选项:
1)为了简单起见,重构您的代码,使其仅引用IOrganizationService,并且仅在测试中使用该代码,并保留TimeOut位未经过测试(超出重构函数的范围)
2)如果对超时属性进行单元测试确实是必要的,那么模拟您自己的OrganizationServiceContext类,并将FakeXrmEasy (IOrganizationService)生成的模拟服务传递给OrganizationServiceProxy的构造函数。下面是所有可用的构造函数的列表:
发布于 2019-05-30 04:32:19
像这样的东西可行吗?
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();
}
}发布于 2019-05-30 16:10:47
我不确定这是否会有帮助,但这是我使用的
CrmServiceClient c = new CrmServiceClient(connectionstring); //various parameters available
(OrganizationServiceProxy) service = c.OrganizationWebProxyClient ?? c.OrganizationServiceProxy;https://stackoverflow.com/questions/56367835
复制相似问题