我用下面的代码来测试,当某个名称传递给我的方法时,它会抛出一个SQL异常(这是有原因的,尽管听起来有点奇怪)。
mockAccountDAL.Setup(m => m.CreateAccount(It.IsAny<string>(),
"Display Name 2", It.IsAny<string>())).Throws<SqlException>();
但是,这不会编译,因为SqlException的构造函数是内部的:
“System.Data.SqlClient.SqlException”必须是具有公共无参数构造函数的非抽象类型,才能将其用作泛型类型或方法“Moq.Language.IThrows.Throws()”中的参数“TException”
现在,我可以将其更改为应该抛出Exception
,但这对我不起作用,因为如果是SqlException
,我的方法应该返回一个状态代码,如果是其他异常,则返回另一个状态代码,这就是我的单元测试所测试的。
有没有什么方法可以在不改变我正在测试的方法的逻辑或者不测试这个场景的情况下实现这一点?
6条答案
按热度按时间axzmvihb1#
如果您需要异常的
Number
或Message
属性的测试用例,您可以使用构建器(使用反射),如下所示:然后,您可以让一个仓库模拟(例如)抛出一个如下所示的异常(这个例子使用
Moq
库):u1ehiz5o2#
这应该行得通:
但是,使用
GetUninitializedObject
有以下警告:由于对象的新示例初始化为零,并且没有运行构造函数,因此该对象可能不表示该对象视为有效的状态。
如果这导致了任何问题,您可能可以使用一些更复杂的反射魔术来创建它,但这种方式可能是最简单的(如果它有效的话)。
c9qzyr3d3#
我刚试过这个,对我很有效:
v1l68za44#
对于我来说,使用Uninitialized Object方法生成一个带有消息的
SqlException
是最简单的方法:q43xntqr5#
我在找到这个问题/答案之前写了这个。对于只想要一个特定数字的SQL异常的人可能很有用。
tktrz96b6#
返回值为0 {var ex =(SqlException)格式化服务.GetUninitializedObject(类型为(SqlExceptionMock));返回值为0 { var ex =(SqlException)(返回值为(SqlException); var errors =生成SqlErrorCollection(错误编号,消息);设置私有字段值(例如,“_errors”,错误);返回ex; }