如何测试使用 SQL 连接和存储过程的 C# 方法
How to test C# method that uses SQL Connection and stored procedure
我目前面临一个大问题,我需要测试一个使用 SQL 服务器连接和 nUnit 中的存储过程的方法。出于某种原因,当我尝试模拟存储库并初始化依赖项时,该方法总是崩溃。
这是我的方法:
public int RunStoredProcedure()
{
List<string> myList = new List<string>();
string connetionString = null;
SqlConnection connection;
SqlDataAdapter adapter;
SqlCommand command = new SqlCommand();
SqlParameter param;
DataSet ds = new DataSet();
int i = 0;
connetionString = _myConnectionRepo.ConnectionString;
connection = new SqlConnection(connetionString);
connection.Open();
command.Connection = connection;
command.CommandType = CommandType.StoredProcedure;
command.CommandText = "SPCOUNTRY";
param = new SqlParameter("@COUNTRY", "Germany");
param.Direction = ParameterDirection.Input;
param.DbType = DbType.String;
command.Parameters.Add(param);
adapter = new SqlDataAdapter(command);
adapter.Fill(ds);
for (i = 0; i <= ds.Tables[0].Rows.Count - 1; i++)
{
myList.Add(ds.Tables[0].Rows[i][0].ToString());
}
connection.Close();
}
单元测试是:
[Test]
public void Should_Return_String_list()
{
_repository.Setup(r => r.RunStoredProcedure()).Returns(new List<string>
{
"string1",
"string2",
"string3"
});
_cnxStringService
.SetUp(x => x.GetConnectionString)
.Returns("MockConnectionString");
var result = _repository.RunStoredProcedure();
Assert.That(result, It.IsNotNull);
}
当我 运行 项目完美运行时,它 returns 值正确,但单元测试表明连接字符串应该为空,我试图向它传递一个简单的字符串,但它说格式不正确,我也尝试使用随机连接字符串,它说没有连接,但如果我传递本地连接字符串,它就可以工作,但是当我将我的更改推送到 repo 中时,它崩溃了。
有人可以帮我解决这个问题吗?
提前致谢。
我自己解决了这个问题,解决方案如下,为了避免单元测试 (nUnit) 中的空引用,我们必须做的是创建两个单独的方法,一个是从引用项目中检索连接字符串和其他拆分该连接字符串的值。
private static string ReturnConnectionString(IEnumerable<JToken> jTokenValues)
{
var cnxString = string.Empty;
for (int i = 0; i < jTokenValues.Count(); i++)
{
var str1 = jTokenValues.ElementAt(i);
foreach (JProperty attributeProperty in str1)
{
if (attributeProperty.Name == "SqlConnectionString")
{
var attribute = str1[attributeProperty.Name];
cnxString = attribute.ToString();
}
}
}
return cnxString;
}
private static IEnumerable<JToken> ConfigureEnvironmentVariablesFromLocalSettings()
{
var path = Path.GetDirectoryName(typeof(DimAccountRepository)
.Assembly.Location); var json =
File.ReadAllText(Path.Join(path, "local.settings.json"));
var parsed = Newtonsoft.Json.Linq.JObject.Parse(json).Values();
return parsed;
}
因此我们可以初始化服务并传递连接字符串并避免空引用。
我目前面临一个大问题,我需要测试一个使用 SQL 服务器连接和 nUnit 中的存储过程的方法。出于某种原因,当我尝试模拟存储库并初始化依赖项时,该方法总是崩溃。
这是我的方法:
public int RunStoredProcedure()
{
List<string> myList = new List<string>();
string connetionString = null;
SqlConnection connection;
SqlDataAdapter adapter;
SqlCommand command = new SqlCommand();
SqlParameter param;
DataSet ds = new DataSet();
int i = 0;
connetionString = _myConnectionRepo.ConnectionString;
connection = new SqlConnection(connetionString);
connection.Open();
command.Connection = connection;
command.CommandType = CommandType.StoredProcedure;
command.CommandText = "SPCOUNTRY";
param = new SqlParameter("@COUNTRY", "Germany");
param.Direction = ParameterDirection.Input;
param.DbType = DbType.String;
command.Parameters.Add(param);
adapter = new SqlDataAdapter(command);
adapter.Fill(ds);
for (i = 0; i <= ds.Tables[0].Rows.Count - 1; i++)
{
myList.Add(ds.Tables[0].Rows[i][0].ToString());
}
connection.Close();
}
单元测试是:
[Test]
public void Should_Return_String_list()
{
_repository.Setup(r => r.RunStoredProcedure()).Returns(new List<string>
{
"string1",
"string2",
"string3"
});
_cnxStringService
.SetUp(x => x.GetConnectionString)
.Returns("MockConnectionString");
var result = _repository.RunStoredProcedure();
Assert.That(result, It.IsNotNull);
}
当我 运行 项目完美运行时,它 returns 值正确,但单元测试表明连接字符串应该为空,我试图向它传递一个简单的字符串,但它说格式不正确,我也尝试使用随机连接字符串,它说没有连接,但如果我传递本地连接字符串,它就可以工作,但是当我将我的更改推送到 repo 中时,它崩溃了。
有人可以帮我解决这个问题吗?
提前致谢。
我自己解决了这个问题,解决方案如下,为了避免单元测试 (nUnit) 中的空引用,我们必须做的是创建两个单独的方法,一个是从引用项目中检索连接字符串和其他拆分该连接字符串的值。
private static string ReturnConnectionString(IEnumerable<JToken> jTokenValues)
{
var cnxString = string.Empty;
for (int i = 0; i < jTokenValues.Count(); i++)
{
var str1 = jTokenValues.ElementAt(i);
foreach (JProperty attributeProperty in str1)
{
if (attributeProperty.Name == "SqlConnectionString")
{
var attribute = str1[attributeProperty.Name];
cnxString = attribute.ToString();
}
}
}
return cnxString;
}
private static IEnumerable<JToken> ConfigureEnvironmentVariablesFromLocalSettings()
{
var path = Path.GetDirectoryName(typeof(DimAccountRepository)
.Assembly.Location); var json =
File.ReadAllText(Path.Join(path, "local.settings.json"));
var parsed = Newtonsoft.Json.Linq.JObject.Parse(json).Values();
return parsed;
}
因此我们可以初始化服务并传递连接字符串并避免空引用。