如何模拟dbset方法Add(),Remove(),SaveChanges()?如何配置正值和负值?

时间:2019-03-13 11:40:49

标签: .net unit-testing mocking nunit moq

我正在尝试为控制器操作编写单元测试。 我正在使用NUnit 3和Moq。

我在操作中有Db方法,例如Add()和Remove()。

我知道我需要模拟Db并相应地设置方法的返回值。

但是,涉及诸如db.Add(),db.Remove(),db.SaveChanges()等方法时,我不明白如何设置相同的true和false返回值。

我要测试的动作:

[HttpPost]
[Route("Add")]
public List<string> Add([FromBody]model addModel)
{
    List<string> errors = new List<string>();
    try
    {
        model Model= new model()
        {
          propertyA = addModel.propertyA
        };
        db.Add(Model);
        db.SaveChanges();

    }
    catch (Exception e)
    {
        errors.Add(e.Message);
        return errors;
    }

    errors.Add("Success");
    return errors;
}

要为上述方法编写正面和负面的测试,我需要能够为db.Add()和db.SaveChanges()方法设置正面和负面的返回值。

我尝试了以下方法:

   [TestCase]
        public void Add_Succesfull_True()
        {
            Mock<DbContext> mockdb = new Mock<DbContext>();
            var model= db.model.Select(x => x).FirstOrDefault();
            model addModel = new model()
            {
               propertyA= model.propertyA
            };

            AuthController authController = new AuthController(userManager, configuration, mockdb.Object);
            var apiEndPoint = authController.Add(addModel);
            mockdb.Setup(x => x.Add(addModel)).Returns(??);

            Assert.IsTrue(apiEndPoint.Contains("Success"));
        }

通过智能感知,我可以看到db.Add()期望返回类型为

  

Microsoft.EntityFrameworkCore.ChangeTracking。

我对模拟DbContext的理解如下:

  • 模拟DbContext界面。
  • 添加,删除,保存等只是被嘲笑而没有实现的方法。
  • 我们设置函数并根据测试用例的需要指定一个返回值,以代替实现。

我相信我以错误的方式嘲笑了上述内容。 需要指导谢谢:)

0 个答案:

没有答案