gpt4 book ai didi

c# - 最小起订量并抛出 SqlException

转载 作者:IT王子 更新时间:2023-10-29 04:10:07 30 4
gpt4 key购买 nike

我有以下代码来测试当某个名称传递给我的方法时,它会抛出一个 SQL 异常(这是有原因的,尽管听起来有点奇怪)。

   mockAccountDAL.Setup(m => m.CreateAccount(It.IsAny<string>(), 
"Display Name 2", It.IsAny<string>())).Throws<SqlException>();

但是,这不会编译,因为 SqlException 的构造函数是内部的:

'System.Data.SqlClient.SqlException' must be a non-abstract type with a public parameterless constructor in order to use it as parameter 'TException' in the generic type or method 'Moq.Language.IThrows.Throws()'

现在,我可以将其更改为声明它应该抛出 Exception,但这对我不起作用,因为如果它是 SqlException<,我的方法应该返回一个状态代码 和另一个如果它是任何其他异常。这就是我的单元测试正在测试的内容。

有没有什么方法可以在不改变我正在测试的方法的逻辑或不测试这个场景的情况下实现这一目标?

最佳答案

如果您需要异常的 NumberMessage 属性的测试用例,您可以使用如下构建器(使用反射):

using System;
using System.Data.SqlClient; // .NetCore using Microsoft.Data.SqlClient;
using System.Linq;
using System.Reflection;

public class SqlExceptionBuilder
{
private int errorNumber;
private string errorMessage;

public SqlException Build()
{
SqlError error = this.CreateError();
SqlErrorCollection errorCollection = this.CreateErrorCollection(error);
SqlException exception = this.CreateException(errorCollection);

return exception;
}

public SqlExceptionBuilder WithErrorNumber(int number)
{
this.errorNumber = number;
return this;
}

public SqlExceptionBuilder WithErrorMessage(string message)
{
this.errorMessage = message;
return this;
}

private SqlError CreateError()
{
// Create instance via reflection...
var ctors = typeof(SqlError).GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance);
var firstSqlErrorCtor = ctors.FirstOrDefault(
ctor =>
ctor.GetParameters().Count() == 7); // .NetCore should be 8 not 7
SqlError error = firstSqlErrorCtor.Invoke(
new object[]
{
this.errorNumber,
new byte(),
new byte(),
string.Empty,
string.Empty,
string.Empty,
new int()
//,new Exception() // for .NetCore
}) as SqlError;

return error;
}

private SqlErrorCollection CreateErrorCollection(SqlError error)
{
// Create instance via reflection...
var sqlErrorCollectionCtor = typeof(SqlErrorCollection).GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance)[0];
SqlErrorCollection errorCollection = sqlErrorCollectionCtor.Invoke(new object[] { }) as SqlErrorCollection;

// Add error...
typeof(SqlErrorCollection).GetMethod("Add", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(errorCollection, new object[] { error });

return errorCollection;
}

private SqlException CreateException(SqlErrorCollection errorCollection)
{
// Create instance via reflection...
var ctor = typeof(SqlException).GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance)[0];
SqlException sqlException = ctor.Invoke(
new object[]
{
// With message and error collection...
this.errorMessage,
errorCollection,
null,
Guid.NewGuid()
}) as SqlException;

return sqlException;
}
}

然后你可以让一个存储库模拟(例如)抛出这样的异常(这个例子使用 Moq 库):

using Moq;

var sqlException =
new SqlExceptionBuilder().WithErrorNumber(50000)
.WithErrorMessage("Database exception occured...")
.Build();
var repoStub = new Mock<IRepository<Product>>(); // Or whatever...
repoStub.Setup(stub => stub.GetById(1))
.Throws(sqlException);

关于c# - 最小起订量并抛出 SqlException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11976996/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com