【问题标题】:Moq a proxy for unit testingMoq 单元测试的代理
【发布时间】:2010-12-10 01:32:38
【问题描述】:

我是使用 Moq 的新手,我找不到这样做的方法。 我有一个 generateId 私有方法,叫做

/// <summary>
/// Generates a call Id for external interfaces
/// </summary>
/// <returns></returns>
private string GenerateCallId()
{
return "EX" + SharedServicesClientProxy.Instance.GenerateId().ToString();
}

我想对这个方法进行单元测试,因此我需要模拟代理。 SharedServicesClientProxy 只是一个实现接口 ISharedServices 但添加了单例的对象。我想测试所有字符串是否正确返回了以“EX”开头的字符串。这是我的单元测试,使用最小起订量

    /// <summary>
    /// A test for GenerateCallId
    /// A CallId for external systems should always start by "EX"
    ///</summary>
    [TestMethod()]
    [DeploymentItem("myDll.dll")]
    public void GenerateCallIdTest()
    {
        myService_Accessor target = new myService_Accessor();
        var SharedServicesClientProxy = new Mock<ISharedServices>();
        SharedServicesClientProxy.Setup(x => x.GenerateId()).Returns(5396760556432785286);
        string actual;
        string extCallIdPrefix = "EX";
        actual = target.GenerateCallId();
        Assert.IsTrue(actual.StartsWith(extCallIdPrefix));
    }

我猜我是在错误的地方进行模拟?

以更一般的方式,我如何模拟将由我正在测试的方法调用的对象? 例如:

        /// <summary>
        /// dummy test
        ///</summary>
        [TestMethod()]
        [DeploymentItem("myDll.dll")]
        public void Foo()
        {
            myService_Accessor target = new myService_Accessor();
            boolexpected = false;
            actual = target.Foo();
            Assert.IsTrue(actual,expected);
        }

        /// <summary>
        /// Foo
        /// </summary>
        /// <returns></returns>
        private bool Foo()
        {
            return this.Bar();
        }

我需要起订量吧,但我需要在哪里做呢? 谢谢, 赛博

【问题讨论】:

    标签: c# unit-testing moq


    【解决方案1】:

    在继续之前搜索术语“依赖注入”。

    您依赖于SharedServicesClientProxy.Instance,它是一个单例。这会导致测试隔离出现问题,因为您将在测试中重复使用同一个实例,并且容易出现状态遗留问题。

    我建议注入这样的依赖项(并且 OT-您不应该测试私有方法...通过公共接口进行测试。它在我的系统之外..:)

    public class AnonClass
    {
      ISharedServices _sharedServices;
      AnonClass(ISharedServices sharedServicesObj)
      {
        _sharedServices = sharedServicesObj;
      }
      public string GenerateCallId()
      {
        return "EX" + _sharedServices.GenerateId().ToString();
      }
    }
    

    重新连接您当前的代码以创建这样的目标类

    var class = new AnonClass(SharedServicesClientProxy.Instance);
    

    在你的测试中,传入模拟对象而不是单例返回的对象

    【讨论】:

      猜你喜欢
      • 2015-09-22
      • 1970-01-01
      • 1970-01-01
      • 2012-11-27
      • 1970-01-01
      • 1970-01-01
      • 2011-12-24
      • 2015-10-04
      • 1970-01-01
      相关资源
      最近更新 更多