1

我是 JustMock 模拟框架的新手,我正在尝试模拟一个私有方法。我完全知道对私有方法进行单元测试是一种通常不好的做法,但在这种情况下,我别无选择。我一直在查看官方文档(http://www.telerik.com/help/justmock/advanced-usage-mocking-non-public-members-and-types.html),但似乎没有任何效果。

这是我的示例代码:

using System;
using Telerik.JustMock;

public class Program
{
    public class Foo
    {
        public void useA()
        {
            a();
        }

        private void a()
        {
            Console.WriteLine("AAAAAAAAAAAAAAA");
        }   
    }

    public static void Main()
    {
        var mockeClass = Mock.Create<Foo>(Behavior.CallOriginal);
        Mock.NonPublic.Arrange(mockeClass, "a").DoInstead(() => Console.WriteLine("Mock success!!!"));      

        mockeClass.useA();
    }
}

这是错误日志:

Run-time exception (line 21): The type initializer for 'Telerik.JustMock.Core.Context.MockingContext' threw an exception.

Stack Trace:

[System.Security.SecurityException: Request for the permission of type 'System.Security.Permissions.FileIOPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.]

[System.TypeInitializationException: The type initializer for 'Telerik.JustMock.Core.Context.MockingContext' threw an exception.]
  at Program.Main(): line 21

我只是很困惑为什么它不起作用。

4

2 回答 2

0

有时测试有助于让我们知道如何改进我们的代码,或者它应该如何构建,在我看来,就像 Kritner 所说的那样,函数应该是公共的而不是私有的。

另一方面,如果您想将其保持为私有,而不是测试对私有方法的调用,您可以在您的公共方法(调用私有方法的地方)中测试私有方法中的代码是否被正确调用像私有方法一样的公共方法不存在,代码直接写在公共方法中。

编辑:您甚至可以创建一个简单的函数来调用私有方法(如果可能的话,添加一些与调用相关的逻辑)并测试这个函数。

于 2016-11-02T13:13:52.880 回答
0

我尝试在一个干净的 .NET 4.5 控制台项目中运行您的代码,它按预期工作 -a()确实打印出模拟值。FileIOPermission是从 JustMock 获得的一个非常不寻常的例外,可能是迄今为止的第一个。通常,权限错误对于控制台应用程序来说更不寻常,因为它们通常在完全信任的情况下运行。

InnerException如果您将System.TypeInitializationException带有调用堆栈的票证粘贴到票证中,这将非常有帮助。只需从调试器中复制它。

于 2017-01-20T23:11:49.937 回答