我正在尝试做tdd,并使用mongodb作为数据库。但我不能解决嘲笑mongodb的问题。是否有能力在.NET中模拟mongodb进行单元测试?
更新
我发现很好的安慰阅读博客。你可以找到它,这里
发布于 2012-10-09 16:49:07
与其模拟MongoDB,不如在MongoDB之上模拟一个层。
您可能需要考虑一个接口,该接口公开存储库上的操作,这些操作与基础数据存储区无关。例如,您可能需要一个抽象出Student类型操作的接口,如下所示:
public interface IStudentOperations
{
void Add(Student student);
}在创建其他依赖项时,可以注入上述接口的实例,或您选择的任何更高级别的抽象。
重点是,不要直接公开MongoDB。
一旦您这样做了,您可以模拟您创建的所有接口,有一个实现来针对模拟实现进行测试,然后使用它自己的测试来验证在底层实现使用MongoDB时,实现上的操作是否正确。
虽然绝对是),但是您获得了持久性不可知论的好处;如果您想切换到CouchDB或elasticsearch,您不必更改对这些接口的调用,只需创建一个新的实现即可。
因为您正在尝试测试实现。,所以您通常都很好,正如前面所述,MongoDB的大部分函数都是virtual,它对大多数模拟库都很友好。
也就是说,您必须确保将MongoDatabase传递到存储库中(而不是在存储库中创建它),以便在单元测试中创建适当的模拟,然后将其传递到存储库实现中进行测试。
发布于 2014-06-11 11:29:51
您需要一个存储库/DAL层来隐藏实现细节。就像这样:
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);
}模拟Add/Delete/Save看起来很简单,有趣的部分是查询函数。幸运的是,由于mongo C#驱动程序支持LINQ表达式,所以我们可以使用LINQ作为查询语言,而不是重新创建车轮。
例如,生产代码可能如下所示:
// collection is a MongoCollection<T> object
var items = collection.AsQueryable().Where(...linq expression...);以及单元测试代码(如果您使用Shim,MS测试):
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>
} 发布于 2012-10-09 16:55:09
参见类似的问题:在node.js中模拟数据库?
简而言之,嘲笑MongoDB不是正确的方法。模拟存储库足以测试您自己的单元,但是如果您希望确保正确使用它,或者依赖唯一性约束等,则仍然需要针对MongoDB进行测试。
https://stackoverflow.com/questions/12804662
复制相似问题