簡體   English   中英

如何測試使用 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);
}

當我運行該項目時,它運行良好,它返回正確的值,但單元測試說連接字符串應該是 null,我試圖給它傳遞一個簡單的字符串,但它說格式不正確,我也嘗試了隨機連接字符串,它說沒有連接,但是如果我傳遞本地連接字符串它可以工作,但是當我推送我的更改時它會崩潰。

有人可以幫我解決這個問題嗎?

提前致謝。

我自己解決了這個問題,解決方案如下,為了避免在單元測試(nUnit)中引用 null 我們必須做的是創建兩個單獨的方法,一個從引用項目中檢索連接字符串,另一個拆分該連接字符串的值。

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;
    }

多虧了這一點,我們可以初始化服務並傳遞連接字符串並避免 null 引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM