我有一个班级XrmServiceContext,每次CRM配置发生变化时都会更改。
我的服务类在其构造函数中接受它:
public class fooService(XrmServiceContext xrmServiceContext)
{
//implementation
}
我需要模拟XrmServiceContext以设置期望并验证单元测试的行为。
如何模拟此类以便在我的fooService测试中定义行为?
答案 0 :(得分:4)
我会通过创建IOrganizationService
的构造函数中使用的假XrmServiceContext
对象来执行此操作,我建议使用:https://github.com/jordimontana82/fake-xrm-easy。您可以通过查看https://dynamicsvalue.com/get-started/overview了解有关如何使用FakeXrmEasy的更多信息,我个人觉得这很容易。
以下是为您的目的使用库的简要概述:
var context = new XrmFakedContext();
context.ProxyTypesAssembly = Assembly.GetAssembly(typeof(Account));
//You'll need to setup this fake to have the data necessary to support your use cases for XrmServiceContext.
var account = new Account() { Id = Guid.NewGuid(), Name = "My First Faked Account yeah!" };
context.Initialize(new List<Entity>() {
account
});
var service = context.GetFakedOrganizationService();
using (var context = new XrmServiceContext(service))
{
//Create instance of fooService class
var testableFooService = new fooService(context);
//TODO: Run your test.
}
答案 1 :(得分:1)
XrmServiceContext
应被视为第三方API。
从服务中创建所需功能的抽象,并在实现中包装/调整上下文。
public interface IXrmServiceContext {
//api endpoints you want
}
因此,不是传递具体的服务上下文,而是将抽象传递给您的服务。
public class fooService {
public fooService (IXrmServiceContext xrmServiceContext){
}
//implementation
}
这样可以更轻松地设置期望并验证单元测试的行为。