Rhino Mock 与 .Net 6 的兼容性

问题描述 投票:0回答:2

有什么方法可以让

rhino.mocks
.NET 6
平台的测试项目中工作吗?

当调用下面的代码时(在 .NET 6 项目下),我总是遇到异常。

例外:

找不到方法:“System.Reflection.Emit.AssemblyBuilder System.AppDomain.DefineDynamicAssembly(System.Reflection.AssemblyName,System.Reflection.Emit.AssemblyBuilderAccess)”。'

代码:

public interface IFoo
{
    void Go();
    int Run();
}

[TestFixture]
public class UnixTest
{
    private MockRepository _repo;

    [SetUp]
    public void Setup()
    {
        _repo = new MockRepository();
    }


    [Test]
    public void Test()
    {
        var stub = _repo.StrictMock<IFoo>();
        Assert.NotNull(stub);
    }
}

更新: 因此,使用 rhino 进行的测试数量巨大,因此我必须发现问题所在。 该异常是由 Castle.DynamicProxy 逻辑在 net6 运行时抛出的。这是解决问题的一种方法:

  1. 下载 rhino-mocks 源代码
  2. 通过工具dotnet-migrate-2019.exe转换项目文件
  3. 将所有项目迁移到.net Framework v.4.6.2平台(castle.core所需的最低版本)
  4. 方法要点:更新所有 rhino 模拟项目外部引用(xunit、castle.core 5 等)
  5. 需要修改源才能使解决方案编译。此外,您将失去委托存根和远程存根(跨应用程序域存根)。实际上,在我们的测试中我们没有使用这两个功能,所以这对我来说不是问题。 这样就可以使用net6.0或net6.0-windows平台创建测试项目了。添加到已编译的犀牛库的显式链接,一切都会正常工作。当然是在windows系统下。

PS: 如果公司允许,我稍后会将修改后的解决方案上传到github。

PPS: Rhino 测试已通过,但存在“测试运行之间”依赖性。因此,如果您一起运行所有测试,其中一些测试可能会随机失败,但如果您单独运行失败的测试,问题就会消失。

c# .net .net-6.0 rhino-mocks rhino
2个回答
2
投票

多么令人怀念的问题。如果我没记错的话,Rhino Mocks 于 2007 年左右出生在 Ayende。然后它的维护逐渐减少,并由 Mike Meisinger 于 2013 年 接手。 他们的存储库中的最后一次提交是 2014 年,也就是 9 年前。

这比 .NET Core 1.0 早了 2 年。我只想说:这个项目已经死了,将您的代码移植到一个可维护的解决方案中,例如 Moq,其中 v5 也已经酝酿多年了。但如果有效,那就有效。

至于为什么:看异常。反射 API 发生了显着变化,并且模拟非常依赖反射。


0
投票

当我们开始将工作中的应用程序从 .NET Framework 迁移到 .NET 8 时,我们遇到了同样的问题。我们有一个非常大的代码库,其中有大量用 Rhino.Mocks 编写的单元测试。手动将所有单元测试重写到另一个单元测试框架是不可能的。

感谢其他开发人员,github 上有几个项目将 Rhino.Mocks 迁移到 .net(核心)。例如:https://github.com/rubicon-oss/CoreRhinoMocks

因此,我们使用 CoreRhinoMocks 能够将我们的应用程序切换到 .NET 8,同时也切换到另一个单元测试框架来进行新的单元测试。在我们的例子中是 NUnit

所以我的建议是:

  • 不要使用 Rhino.Mocks 开始新项目,因为它已经过时了
  • 对于新项目,使用新的积极维护的单元测试框架,如 NUnit
  • 如果您有大量使用 rhino 模拟编写的单元测试,请使用 CoreRhinoMocks
© www.soinside.com 2019 - 2024. All rights reserved.