0

帮助!

这段代码在我的本地 VS2010 和 TypeMock 上运行良好,但是在我们的构建服务器上失败,当通过 NCover 运行时。

我的代码:

 using (RecordExpectations expect = RecorderManager.StartRecording())
    {
74:             RequestDataLayer.GetAllUsers();
75:             expect.Return(DatabaseUsers);
                // other definitions to follow
    }

在 CruiseControl.Net 环境中产生此错误:

Execute
TypeMock.TypeMockException: 
*** Cannot use Return in this sequence, there must be a mocked statement first
Perhaps you are trying to mock a method from mscorlib
   at TypeMock.RecordExpectations.b(String A_0)
   at TypeMock.RecordExpectations.a(String A_0)
   at TypeMock.RecordExpectations.Return(Object returnValue)
   at Request.UserSyncTest.SyncData() in UserSyncTest.cs:line 75

我尝试模拟的方法的来源是:

public class RequestDataLayer
{
        public static User[] GetAllUsers()
        {
            // some LINQ magic to get users out of DB, then a .ToArray()
            // returns an object array
        }
}

因此,除了该方法是静态的这一事实之外,它并没有什么特别之处。从那以后,我重构了该方法,使其成为非静态的,效果在此页面的底部。

我之前遇到过类似的问题,这与利用 TypeMock 的 Isolate<> 语法有关,我遇到了相同的场景,测试在本地运行良好(通过 Gallio 测试运行器),但在构建服务器上失败(CC.Net ,加里奥,TypeMock,NCover)。

我在开发和构建框上运行 6.0.4.0 的 TypeMock。

此外,似乎有效的是在 RecordExpectations 块中向下移动第 74 行和第 75 行 - 错误没有显示,但是方法调用根本没有被无声地模拟。

欢迎提出想法。

4

3 回答 3

4

当我看到这种事情时,通常是:

  • 测试排序 - 测试在开发盒上以一个顺序运行,但在构建盒上以不同的顺序运行,这揭示了一些问题,例如一些固定装置在自己之后没有正确清理。
  • 环境差异——比如运行 32 位构建的开发环境,但运行 64 位构建的构建服务器。

我的博客上有这些难以解决的问题的故障排除指南。尝试运行它,看看它们中的任何一个看起来是否可以帮助你。

我会这样说:有时要找出导致问题的夹具是一个漫长而痛苦的过程。我已经一直到从单元测试程序集中删除所有固定装置并将它们添加回来,一次一个,直到问题再次出现。你可能需要有点耐心。

如果您有选择,请升级到最新版本。随着每个版本的发布,Typemock 对这些奇怪的问题越来越好,并且问题可能会在以后的版本中得到纠正。

于 2011-12-06T21:46:23.420 回答
0

好的,我们发现了问题所在——令人尴尬的是,没有通过 NAnt 脚本正确调用 TypeMock。

这仍然是一个谜,但是为什么我们没有简单地看到“TypeMock”未启用错误消息,而是这种奇怪的行为。

于 2011-12-07T16:57:08.410 回答
0

免责声明我在 Typemock 工作。

您是否在测试方法或测试类上使用 ClearMocks 属性?
如果您正在使用该属性但仍然出现异常,请联系我们的支持:
typemock.com的支持

于 2011-12-07T08:54:12.503 回答