【问题标题】:The right way to mock (with moq) methods that return mocked objects?模拟(使用 moq)返回模拟对象的方法的正确方法?
【发布时间】:2009-08-02 06:37:53
【问题描述】:

以下哪个是正确的?

var mockLogger = new Mock<EntLibLogger>();
mockLogger.Setup(i => i.CreateTracer(It.IsAny<string>()))
    .Returns((string operationName) =>
        {
            var mockTracer = new Mock<EntLibTracer>(operationName);
            mockTracer.Setup(i => i.IsTracingEnabled())
                .Returns(true);
            mockTracer.CallBase = true;

            return mockTracer.Object;
        });
mockLogger.CallBase = true;

//EntLibLogger.Current is a singleton that is shared across multiple threads.
//This Initialize method will set EntLibLogger.Current to the mocked instance
//instead of the default (non-mocked) configuration
EntLibLogger.Initialize(mockLogger.Object);

var mockTracer = new Mock<EntLibTracer>(operationName);
mockTracer.Setup(i => i.IsTracingEnabled())
    .Returns(true);
mockTracer.CallBase = true;

var mockLogger = new Mock<EntLibLogger>();
mockLogger.Setup(i => i.CreateTracer(It.IsAny<string>()))
    .Returns(mockTracer.Object);
mockLogger.CallBase = true;

EntLibLogger.Initialize(mockLogger.Object);

我相信第一种方法是正确的,但我不确定 Moq 是否会在幕后发挥作用,只是想验证一下 :)

【问题讨论】:

    标签: c# .net unit-testing mocking moq


    【解决方案1】:

    我想主要问题是如果它调用CreateTracer 两次,你想发生什么。在第一个版本中,您将获得两种不同的模拟示踪剂;在一秒钟内,您将获得相同的两次。

    第二个版本是我在 jMock、EasyMock 和 Rhino.Mocks 中常用的版本 - 但我没有任何起订量的经验,所以使用第一个版本可能更习惯在那里形成。第二个更简单,IMO :)

    【讨论】:

    • 为了简单起见,我同意使用第二个选项。 Nesten lambdas 很难阅读。如果你每次都想要一个新的,你可以使用第一个选项,但提取内部表达式并给它一个好名字。
    猜你喜欢
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 2010-11-12
    • 1970-01-01
    相关资源
    最近更新 更多