如何模拟DbUpdateConcurrencyException

时间:2019-07-09 17:10:38

标签: entity-framework-core moq

我正在尝试在服务中模拟函数以抛出DbUpdateConcurrencyException。我的代码仅需要检查类型为DbUpdateConcurrencyException的异常,而无需读取异常消息或构造函数要求的条目列表。

我想通过调用Mock的无参数构造函数来设置DbUpdateConcurrencyException,但是EFCore中不存在该构造函数。

var mockService = new Mock<IMyService>();
mockService.Setup(service => service.UpdateFooAsync(It.IsNotNull<Data.Foo>())).Throws(new DbUpdateConcurrencyException());

我尝试使用一些参数调用new DbUpdateConcurrencyException(),但是在参数上进行了一些检查,使我无法使用空/空数据。

new DbUpdateConcurrencyException(null, null)给出:

Message: System.ArgumentNullException : Value cannot be null.
Parameter name: entries

new DbUpdateConcurrencyException("", new List<IUpdateEntry>())给出:

Message: System.ArgumentException : The collection argument 'entries' must contain at least one element.

Moq中是否有一种方法可以模拟DbUpdateConcurrencyException,而不必经过构造函数的检查?

1 个答案:

答案 0 :(得分:2)

基于您在评论中共享的文档,您应该使用带有两个参数的ctor。诀窍是提供不为空的string和不为空的List<IUpdateEntry>moq可以帮助您,例如

new DbUpdateConcurrencyException(string.Empty, new List<IUpdateEntry>{Mock.Of<IUpdateEntry>()});