【问题标题】:How to mock GetView operation of couchbase .net SDK如何模拟couchbase .net SDK的GetView操作
【发布时间】:2015-11-30 05:54:21
【问题描述】:

我正在尝试为使用 .NET SDK 在沙发基础服务器上执行 view 的方法编写单元测试,但无法模拟 o/p。

方法:-

  public int CountJsonDocs()
        {
            int savedFiles = 0;
            var viewResult = _couchbaseClient.GetView("GetAllDocs", "GetAllDocuments");
            if (viewResult.TotalRows > 0)
            {
                foreach (var viewRow in viewResult)
                {
                    var jsonData = viewRow.GetItem();
                    savedFiles++;
                }
            }
            return savedFiles;
        }

GetView() 方法返回一个 IView 类型的对象

【问题讨论】:

  • 你能展示 _couchbaseClient 是如何被实例化的吗?是Couchbase提供的接口类型还是第三方代码?通常,大多数 .NET 模拟框架不允许在具体类上模拟非虚拟方法。还有一个通用的嘲笑指南,即“不要嘲笑你不拥有的东西”(blog.8thlight.com/eric-smith/2011/10/27/thats-not-yours.html),这可能与您要解决的问题有关。
  • CouchbaseClient 是 .NET SDK for Couchbase 的一部分
  • 您可以使用MsFakes 来处理RhinoMocks 无能为力的情况......当我在.Net 世界时,我有时会一起使用它们......跨度>

标签: c# .net unit-testing mocking rhino-mocks


【解决方案1】:

简短的回答:无需支付像 Typemock 的 Isolator 这样的重型模拟框架:你不能

更长的答案: 大多数 .NET 模拟框架通过生成您要模拟的内容的子类并覆盖/实现您模拟的方法来工作。这与 C# 处理方法覆盖的方式相结合(即,如果你想覆盖一个方法,你必须明确地将其声明为“虚拟”)导致大多数模拟框架只能模拟具体类上的接口或虚拟方法。

在模拟“只模拟你拥有的类型”(或“不要模拟你不拥有的东西”)的东西时,有一个通用准则。这基本上意味着模拟第三方行为是危险的,因为您无法控制它的 API 或实现。

我如何测试使用第三方库的东西是这样的:

  • 围绕您控制的第三方库编写一个精简的包装层,该库具有干净的界面。
  • 为此使用实际的第三方组件的包装层编写精简集成测试
  • 让您的其余部分依赖于您的新包装器接口。
  • 您现在可以通过模拟精简界面来非常轻松地测试您的其他逻辑。

通过这种方式,您可以保证第三方代码执行您认为的操作(以及一种在未来自动验证您的假设的方法),并且您能够正确测试您的代码,而不会过度依赖第三方代码.

【讨论】:

    【解决方案2】:

    免责声明,我在 Typemock 工作。

    如前所述,Typemock Isolator 可以帮助您模拟几乎所有内容。对于测试 CountJsonDocs() 我已经模拟了 couchbase 调用,请看下面的示例:

    [TestMethod, Isolated]
    public void TestCount()
    {
        //Arrange
        int expSize = 5;
    
        var fakeClient = Isolate.Fake.AllInstances<CouchbaseClient>();
        var fakeIView = Isolate.Fake.AllInstances<IView>();
        var fakeIViewRow = Isolate.Fake.AllInstances<IViewRow>();
    
        LinkedList<IViewRow> resultList = new LinkedList<IViewRow>();
        for (int i = 0; i < expSize; i++)
             resultList.AddFirst(fakeIViewRow);
    
       Isolate.WhenCalled(() => fakeIView.TotalRows).WillReturn(expSize);
       Isolate.WhenCalled(() => fakeIView.GetEnumerator()).WillReturn(resultList.GetEnumerator());
       Isolate.WhenCalled(() => fakeClient.GetView("", "")).WillReturnCollectionValuesOf(fakeIView);
    
       //Act
       var target = new ClassUnderTest();
       var result = target.CountJsonDocs();
    
       //Assert
       Assert.AreEqual(expSize, result);
    

    }

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 2015-09-30
      • 1970-01-01
      • 2016-07-08
      • 2016-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-12
      • 1970-01-01
      相关资源
      最近更新 更多