我使用内置的 Visual Studio 单元测试工具对 CRM 2011 执行单元测试。很多测试都在断言创建实体。
Assert.IsNull(service.GetFirstOrDefault<Contact>(contact.Id));
(GetFirstOrDefault 是一个扩展方法,它尝试通过 id 从 CRM 中检索联系人,如果没有找到则返回 null)
我想创建自己的 Assert 方法,该方法的运行方式如下:
CrmAssert.Exists(service, contact);
起初我认为继承 from 是个好主意Assert
,但可惜它是一个静态类。然后我创建了一个新的静态类,如下所示:
public static class AssertCrm
{
public static void Exists<T>(IOrganizationService service, T entity) where T : Entity
{
Exists(service, entity, null, null);
}
public static void Exists<T>(IOrganizationService service, T entity, string message) where T : Entity
{
Exists(service, entity, message, null);
}
public static void Exists<T>(IOrganizationService service, T entity, string message, params object[] parameters) where T: Entity
{
if (service.GetFirstOrDefault<T>(entity.Id) == null)
{
throw new AssertFailedException(message == null ? String.Format(message, parameters));
}
}
}
像这样调用:
AssertCrm.Exists(service, contact);
这很好,除了我真的应该能够设置服务一次,而不必每次都调用它:
AssertCrm.Service = service;
AssertCrm.Exists(contact);
AssertCrm.Exists(campaign);
AssertCrm.Exists(etc...);
但我相信 Visual Studio 会尝试多线程运行测试,这意味着当我设置Service
静态属性时,它可能会被不同测试中的不同服务覆盖(并且IOrganizationService
不是线程安全的)。
我是否需要使我的 AssertCrm 类为非静态类,这样我就不必担心多线程?有没有我错过的更简单的技术?