首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >.NET中的Mongodb单元测试

.NET中的Mongodb单元测试
EN

Stack Overflow用户
提问于 2012-10-09 16:44:41
回答 4查看 23.6K关注 0票数 19

我正在尝试做tdd,并使用mongodb作为数据库。但我不能解决嘲笑mongodb的问题。是否有能力在.NET中模拟mongodb进行单元测试?

更新

我发现很好的安慰阅读博客。你可以找到它,这里

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-10-09 16:49:07

与其模拟MongoDB,不如在MongoDB之上模拟一个层。

您可能需要考虑一个接口,该接口公开存储库上的操作,这些操作与基础数据存储区无关。例如,您可能需要一个抽象出Student类型操作的接口,如下所示:

代码语言:javascript
复制
public interface IStudentOperations
{
    void Add(Student student);
}

在创建其他依赖项时,可以注入上述接口的实例,或您选择的任何更高级别的抽象。

重点是,不要直接公开MongoDB。

一旦您这样做了,您可以模拟您创建的所有接口,有一个实现来针对模拟实现进行测试,然后使用它自己的测试来验证在底层实现使用MongoDB时,实现上的操作是否正确。

虽然绝对是),但是您获得了持久性不可知论的好处;如果您想切换到CouchDB或elasticsearch,您不必更改对这些接口的调用,只需创建一个新的实现即可。

因为您正在尝试测试实现。,所以您通常都很好,正如前面所述,MongoDB的大部分函数都是virtual,它对大多数模拟库都很友好。

也就是说,您必须确保将MongoDatabase传递到存储库中(而不是在存储库中创建它),以便在单元测试中创建适当的模拟,然后将其传递到存储库实现中进行测试。

票数 16
EN

Stack Overflow用户

发布于 2014-06-11 11:29:51

您需要一个存储库/DAL层来隐藏实现细节。就像这样:

代码语言:javascript
复制
public interface IDataContext<T>
{
   // Query
   IList<T> GetAll<T>();
   IList<T> GetByCriteria<T>(Query query);
   T GetByID<T>(string id);

   // CUD
   void Add(T item);
   void Delete(T item);
   void Save(T item);
}
  • 对于生产代码,在C#驱动程序的帮助下,使用mongo操作实现接口。
  • 对于单元测试代码,使用内存中的集合模拟接口。

模拟Add/Delete/Save看起来很简单,有趣的部分是查询函数。幸运的是,由于mongo C#驱动程序支持LINQ表达式,所以我们可以使用LINQ作为查询语言,而不是重新创建车轮。

例如,生产代码可能如下所示:

代码语言:javascript
复制
// collection is a MongoCollection<T> object
var items = collection.AsQueryable().Where(...linq expression...);

以及单元测试代码(如果您使用Shim,MS测试):

代码语言:javascript
复制
using (ShimsContext.Create())
{                  
    ShimLinqExtensionMethods.AsQueryableOf1MongoCollectionOfM0(
        (MongoCollection<T> x) => Fake_DB_Collection.AsQueryable());
    // After this, the above "collection.AsQueryable()" will be mocked as 
    // an in-memory collection, which can be any subclass of IEnumerable<T>             
} 
票数 3
EN

Stack Overflow用户

发布于 2012-10-09 16:55:09

参见类似的问题:在node.js中模拟数据库?

简而言之,嘲笑MongoDB不是正确的方法。模拟存储库足以测试您自己的单元,但是如果您希望确保正确使用它,或者依赖唯一性约束等,则仍然需要针对MongoDB进行测试。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12804662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档