【问题标题】:Mock issue - Value cannot be null. (Parameter 'source')模拟问题 - 值不能为空。 (参数“来源”)
【发布时间】:2021-11-06 12:51:46
【问题描述】:

我正在尝试使用 Moq 测试 API 服务并收到错误消息:

值不能为空。 (参数“来源”)。

以下是代码[在现实世界中已经运行良好,Mock 是一个回顾性项目。]

models = new List<MyModel> {
    new MyModel
    {
    Id = 1,
    Name = "John Smith",
    Status = "Engineer",
    Centre = 9999
    },
    new MyModel
    {
    Id = 2,
    Name = "Jane Doe",
    Status = "Manager",
    Centre = 9999
    } };

var mockDbSet = new Mock<DbSet<MyModel>>();
mockDbSet.As<IQueryable<MyModel>>().Setup(m => m.Provider).Returns(models.AsQueryable().Provider);
mockDbSet.As<IQueryable<MyModel>>().Setup(m => m.Expression).Returns(models.AsQueryable().Expression);
mockDbSet.As<IQueryable<MyModel>>().Setup(m => m.ElementType).Returns(models.AsQueryable().ElementType);
mockDbSet.As<IQueryable<MyModel>>().Setup(m => m.GetEnumerator()).Returns(models.GetEnumerator());
mockDbSet.Setup(m => m.Add(It.IsAny<MyModel>())).Callback<MyModel>(models.Add);

mockContext = new Mock<LiveDbContext>();
mockContext.Setup(m => m.Add(models)).Callback<DbSet<MyModel>>(mockDbSet.Object.AddRange);

myService = new LiveService(mockContext.Object);            
var result = myService.GetStaffByCentre(9999).Result.ToList();

//Assert
Assert.AreEqual(1, result.Count);            

似乎导致错误的行是

var result = myService.GetStaffByCentre(9999).Result.ToList();

【问题讨论】:

  • 附加调试器,它会快速显示是什么引发了异常。如果您无法做到,请分享堆栈跟踪,这样我们就不必猜测了。

标签: c# testing moq


【解决方案1】:

我们真的不知道您的服务/SUT 正在做什么,因为您没有提供它,但我假设它对 DbSet&lt;MyModel&gt; 执行查询并将未解​​析的枚举作为 Result 成员返回。如果是这种情况,ToList() 调用是异常发生的地方,当枚举被解析时。

在我们进一步讨论之前,我的第一个问题是您能否使用内存数据库提供程序。模拟 EFCore 很难,Microsoft doesn't recommend it

如果有一个原因你不能使用内存数据库提供程序,并且我的假设是正确的,这可能是因为你没有设置查询提供程序方法,例如 CreateQueryExecute由 LINQ 扩展使用。你需要再次模拟哪个我不能说,我没有足够的细节。

【讨论】:

  • 感谢您抽出宝贵时间回复 rgvlee。我是 Moq 的新手,所以会花时间研究您的建议并尽快发布更新。一切顺利。
【解决方案2】:

只是为了提供更新,也许可以帮助处于相同情况的其他人。我意识到我需要添加一个 Repository 层并创建它的模拟,以便创建和运行单元测试。

Mock 存储库使用“模型”列表 [参见原始帖子] 作为其数据源,这意味着我可以不再需要创建“模拟上下文”对象和模拟 DbSet。

我发现this tutorial 很有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-12
    • 2020-08-03
    • 1970-01-01
    相关资源
    最近更新 更多