首页 > 解决方案 > 模拟 mongodb 时,mongoclient 始终为空

问题描述

[TestClass]
public class MyTests
{        
    private CarsContext carsContext;
    private Mock<IMongoDatabase> _mockDB;
    private Mock<IMongoClient> _mockClient;
    
    [TestInitialize]
    public void Setup()
    {
     _mockClient = new Mock<IMongoClient>();
     _mockDB = new Mock<IMongoDatabase>();
     db = Guid.NewGuid().ToString();
     _mockClient.Setup(c => c.GetDatabase(db, null)).Returns(_mockDB.Object);

     carsContext = new CarsContext(_mockClient.Object, db);
    }
    
    [TestMethod]
    public async Task TestOne()
    {
        var objToInsert = new Car{ ... };

        //always null (carsContext Client is always null and db property is populated with Mocked object.
        var cars =  carsContext.GetCollection<Car>("cars"); 
        cars.InsertOne(objToInsert);
    }   
}   


public class Car : Entity
{
    public string Name {get; set;}
    ...
}

public class CarContext : ICarContext
{
    private readonly IMongoDatabase _db;
    
    public IMongoClient MongoClient
    {
        get { return _db.Client; } // always null
    }
    
    public CarContext(IMongoClient mongoClient, string db)
    {
        _db = mongoClient.GetDatabase(db); // _db.Client is always null
    }
}
    

标签: c#.netmongodbunit-testing

解决方案


您需要设置_mockDB要传入的内容以返回集合:

var collectionMock = new Mock<IMongoCollection<Car>>();
_mockDB.Setup(c => c.GetCollection<Car>("cars")).Returns(collectionMock.Object);

推荐阅读