Dynamics CRM - 单元使用RhinoMocks测试插件会产生奇怪的结果

时间:2017-01-30 12:16:48

标签: plugins dynamics-crm

我正在使用Dynamics CRM和RhinoMocks为插件编写单元测试。 在删除了OrganizationService.Retrieve()方法之后,当我调用stubbed out方法时,我将返回null。

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

这是我的代码:

TestSetup

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

organisationServiceMock.Expect(x =&gt; x.Retrieve(“someCrmEntity”,someGuid,SomeCrmEntityColumnSetQuery.ColumnSet))                 .Return(新实体                 {                     LogicalName =“someCrmEntity”,                     Id = Guid.NewGuid(),                 });

SomeCrmEntityColumnSetQuery Code

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

调用代码

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

// someEntity为null

我尝试过的事情

  1. 删除了ColumnSet并将其替换为null - 这可以正常工作
  2. 使用默认实例(new ColumnSet())替换静态类SomeCrmEntityColumnSetQuery
  3. 我已将someGuid设置为Guid.Empty,认为它没有“加入”正确的Guid,因此返回空值。
  4. 我试图用.Stub()替换.Expect() - 没有快乐
  5. 修改 在期望中,我尝试了.WhenCalled(...),这就是我发现如果我在期望和调用中用null替换columnSet参数的方法,它可以工作。所以它是在我的静态类中表示ColumnSet的东西。代码就像我在DEV环境中运行一样工作。

    如果有人可以就此分享一些亮点,那就太神奇了!

    查尔斯

1 个答案:

答案 0 :(得分:0)

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

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

var organisationServiceMock = MockRepository.GenerateMock();

//错误 organisationServiceMock.Expect(x =&gt; x.Retrieve(&#34; someCrmEntity&#34;,someGuid,SomeCrmEntityColumnSetQuery.ColumnSet))。Return(new Entity());

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

//正确 organisationServiceMock.Expect(x =&gt; x.Retrieve(Arg.Is.Anything,Arg.Is.Anything,Arg.Is.Anything))。Return(new Entity());

//在调用期间,stubbed方法现在要求第一个参数为字符串,然后第2个为Guid,第3个为ColumnSet。

我希望这有助于任何一直在努力解决这个问题的人。 :)