如何模拟一个不断变化的课程?

时间:2016-08-30 14:22:14

标签: c# unit-testing nunit dynamics-crm-2011 moq

我有一个班级XrmServiceContext,每次CRM配置发生变化时都会更改。

我的服务类在其构造函数中接受它:

public class fooService(XrmServiceContext xrmServiceContext)
{
   //implementation
}

我需要模拟XrmServiceContext以设置期望并验证单元测试的行为。

如何模拟此类以便在我的fooService测试中定义行为?

2 个答案:

答案 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
}

这样可以更轻松地设置期望并验证单元测试的行为。