【发布时间】:2012-08-12 04:51:27
【问题描述】:
我有以下代码来测试当某个名称被传递给我的方法时,它会抛出一个 SQL 异常(这是有原因的,虽然这听起来有点奇怪)。
mockAccountDAL.Setup(m => m.CreateAccount(It.IsAny<string>(),
"Display Name 2", It.IsAny<string>())).Throws<SqlException>();
但是,这不会编译,因为 SqlException 的构造函数是内部的:
'System.Data.SqlClient.SqlException' 必须是非抽象类型 一个公共无参数构造函数,以便将其用作参数 泛型类型或方法中的“TException” 'Moq.Language.IThrows.Throws()'
现在,我可以更改它以声明它应该抛出Exception,但这对我不起作用,因为如果它是SqlException,我的方法应该返回一个状态码,如果它是任何其他状态码则返回另一个例外。这就是我的单元测试正在测试的内容。
有没有什么方法可以在不改变我正在测试的方法的逻辑或不测试这个场景的情况下实现这一点?
【问题讨论】:
-
您可以使用反射来访问允许您创建 SQLException 的内部方法 CreateException。 stackoverflow.com/questions/1259222/… .... msdn.microsoft.com/en-us/library/ms229394(v=vs.100).aspx ... 然后只需做一个 lamda 来创建并抛出它。
标签: c# .net unit-testing mocking moq