如何在c#桌面应用程序中对特定功能执行单元测试?

时间:2018-10-24 17:26:37

标签: c# unit-testing

我有一个名为LoadCitation的函数。

public void LoadCitation()
    {

        cmd = new SqlCommand("select * from tbl_Users where isLogin=1", con);
        sqlDataAdapter = new SqlDataAdapter(cmd);
        DataSet ds = new DataSet();
        sqlDataAdapter.Fill(ds);
        String username = ds.Tables[0].Rows[0]["username"].ToString();
        sqlDataAdapter = new SqlDataAdapter("select id,title,author1_fname,author1_lname,author2_fname,author2_lname,author3_fname,author3_lname,doctype,year,publisher,abstract,nameofdoc,issue,volume,pgno,url,accessdate,notes,tag from tbl_Citation  where username ='" + username + "'", con);
        DataSet = new DataSet();
        con.Open();
        sqlDataAdapter.Fill(DataSet, "tbl_Citation");
        con.Close();

        dgeviewcitation.DataSource = DataSet;
        dgeviewcitation.DataMember = "tbl_Citation";
    }

我想对此方法进行单元测试。

[TestClass()]
public class EditcitationTests
{

    [TestMethod()]
    public void LoadCitationTest()
    {

    }
}

我已经创建了方法,但是不知道在单元测试中要写什么...

1 个答案:

答案 0 :(得分:1)

按照书面规定,该方法不可单元测试。

那是因为它对外部资源有严格的依赖性。如果测试在没有设置数据库的环境中运行怎么办?您如何知道数据库中将包含哪些数据?单元测试绝不能离开其类(和任何模拟)。

因此,首先,您需要将该SQL放入注入到表单的服务中(还可以修复SQL注入漏洞!)。然后,您的测试将模拟该服务(使用类似NSubstituteMoq的服务),然后您可以验证模拟返回的数据是否正确存储在dgeviewcitation中。

请注意,UI通常是单元测试的糟糕选择,正确的方法是将UI置于实际逻辑上非常薄(尽可能薄)的层,然后对逻辑进行单元测试。诸如MVVM之类的架构模式试图为此提供帮助。