【问题标题】:Dynamics CRM - Unit Testing a plugin with RhinoMocks give weird resultDynamics CRM - 使用 RhinoMocks 对插件进行单元测试会产生奇怪的结果
【发布时间】:2017-01-30 12:16:47
【问题描述】:

我正在使用带有 RhinoMocks 的 Dynamics CRM 为插件编写单元测试。 在删除了 OrganizationService.Retrieve() 方法后,当我调用已删除的方法时,我得到了 null 返回。

据我所见(如果我错了,请纠正我),存根的方法签名必须与调用签名相同。

这是我的代码:

测试设置

var someGuid = Guid.Empty;
var organisationServiceMock = MockRepository.GenerateMock<IOrganizationService>();

organisationServiceMock.Expect(x => x.Retrieve("someCrmEntity", someGuid, SomeCrmEntityColumnSetQuery.ColumnSet)) .Return(新实体 { 逻辑名称 = "someCrmEntity", Id = Guid.NewGuid(), });

SomeCrmEntityColumnSet查询代码

public static class SomeCrmEntityColumnSetQuery
{
public static ColumnSet ColumnSet => new ColumnSet("column1", "column2");
}

调用代码

var someEntity = organisationServiceMock.Retrieve("someCrmEntity", someGuid, SomeCrmEntityColumnSetQuery.ColumnSet);

//someEntity 为空

我尝试过的事情

  1. 删除了 ColumnSet 并将其替换为 null - 这有效
  2. 将静态类 SomeCrmEntityColumnSetQuery 替换为默认实例 (new ColumnSet())
  3. 我已将 someGuid 设置为 Guid.Empty,认为它没有“加入”正确的 Guid,因此返回值为 null。
  4. 我已尝试将 .Expect() 替换为 .Stub() - 不高兴

编辑 在期望中,我尝试了 .WhenCalled(...) ,这就是我发现如果我在期望和调用中用 null 替换 columnSet 参数,它就可以工作。所以它与我的静态类中代表 ColumnSet 的东西有关。该代码可以在我的 DEV 环境中运行。

如果有人能分享一些关于这方面的知识,那就太神奇了!

查尔斯

【问题讨论】:

  • 请添加完整的测试和完整的代码调用,我想知道您的 guid 是否相同。我认为ColumnSet 应该是公开的,分配应该是= 而不是=&gt;
  • Sxntk: 编辑代码
  • OrganisationServiceMock 是全局变量吗?
  • 不。这是本地的。我忘记复制变量了。
  • 你应该声明模拟,然后设置期望IOrganizationService service = MockRepository.GenerateMock&lt;IOrganizationService&gt;();

标签: plugins dynamics-crm


【解决方案1】:

所以我在观看 RhinoMocks 上的 PluralSight 视频后找到了答案。

我的问题是,在设置存根时,存根不采用 ,而是采用您正在存根的方法的签名。例如:

var organizationServiceMock = MockRepository.GenerateMock();

//错误 organizationServiceMock.Expect(x => x.Retrieve("someCrmEntity", someGuid, SomeCrmEntityColumnSetQuery.ColumnSet)).Return(new Entity());

//存根不关心在调用时将什么值发送到方法中,而是关心方法签名类型是否匹配。

//正确 organizationServiceMock.Expect(x => x.Retrieve(Arg.Is.Anything, Arg.Is.Anything, Arg.Is.Anything)).Return(new Entity());

//在调用期间,存根方法现在期望第一个参数是一个字符串,然后第二个是一个 Guid,第三个是一个 ColumnSet。

我希望这可以帮助那些也在为此苦苦挣扎的人。 :)

【讨论】:

  • 如果您只想忽略所有输入参数,您可以使用 .IgnoreArguments()
猜你喜欢
  • 1970-01-01
  • 2015-10-04
  • 1970-01-01
  • 2012-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-11
  • 1970-01-01
相关资源
最近更新 更多