【问题标题】:JustMock how to ignore a method call made inside the method under testJustMock如何忽略在被测方法内部进行的方法调用
【发布时间】:2013-06-03 14:12:17
【问题描述】:

我正在使用 JustMock 来帮助编写单元测试,并得出了一些我认为相当简单但找不到答案的东西。我不能发布任何代码,但我会尽力解释。我想出了一个例子来展示我正在尝试做的事情。我想测试 Class1 的 Close 方法,而不调用 Class2 的 CloseConnection 方法。我尝试在 Class2 的 CloseConnection 实例上使用 Mock.Arrange,但我相信它特定于您在哪个实例上进行排列。在我设置单元测试和模拟(示例代码下面的模拟代码)然后在 Class1 的 Close 方法中进行调试后,它仍然从 Class2 调用 CloseConnection 方法,我认为是因为 Class2 依赖项是在 Class1 的构造函数中创建的,我没有访问权限直接给它。

public class Class1
{
    private Class2 instanceOfClass2;

    public Class1()
    {
       instanceOfClass2 = new Class2();
    }

    public void Close()
    {
        // other code here
        instanceOfClass2.CloseConnection(true);
    }
}   

public class Class2
{
    public void CloseConnection(bool persist)
    {
        // Method I don't want executed
    }
}

有谁知道我如何测试 Class1 的 Close 方法并使用 JustMock 忽略对 Class2 的 CloseConnection 方法的调用?

我试过了:

Mock.Arrange(() => instanceOfClass2.CloseConnection(persist)).DoNothing();

连同模拟和非模拟的 class2 实例和不同的参数(即 Arg.IsAny()),但仍然无法阻止此方法调用的发生。

重构代码对我来说不是一个选项,所以我无法更改它以注入依赖项,我阅读了有关使用 justmock 模拟构造函数的信息,但它似乎忽略了构造函数,而不是让我为使用 Class1,以便我可以访问 Class2。

有什么想法吗?

更新 1:Telerik 回到我身边并说尝试使用 .IgnoreInstance() 仍然没有阻止对 CloseConnection 的调用。等待 Telerik 的另一个回复。

【问题讨论】:

    标签: c# unit-testing justmock


    【解决方案1】:

    (完全披露:我在 Telerik 工作)

    使用 JustMock 的最新内部版本,我尝试了以下测试,并且在启用分析器的情况下,它成功通过了。请注意,您不能阻止对方法的调用,您只能阻止执行方法的原始主体。

        [TestMethod]
        public void ShouldArrangeFutureCallToMethod()
        {
            // arrange CloseConnection for all future instances of Class2.
            // "new X()" is equivalent to using .IgnoreInstance()
            Mock.Arrange(() => new Class2().CloseConnection(Arg.AnyBool)).DoNothing();
    
            // act
            var c1 = new Class1();
            c1.Close();
            //success: didn't throw
        }
    
        public class Class1
        {
            private Class2 instanceOfClass2;
    
            public Class1()
            {
                instanceOfClass2 = new Class2();
            }
    
            public void Close()
            {
                // other code here
                instanceOfClass2.CloseConnection(true);
            }
        }
    
        public class Class2
        {
            public void CloseConnection(bool persist)
            {
                throw new NotImplementedException();
            }
        }
    

    【讨论】:

    • 谢谢,连同我从 Telerik 收到的另一个回复,我现在知道了。在阅读文档时,我认为它甚至不会进入该方法(以及其他没有进入该方法的 DoNothing 示例)。只是一个简单的问题,如果您要按照答案中的方式进行操作,是否可以在该 class2 对象上断言 MustBeCalled 之类的事情?
    • 是的,Mock.Assert(() => new Class2().CloseConnection(Arg.AnyBool), Occurs.AtLeastOnce());。相同的规则适用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多