WinForms单元测试

3

我刚开始学编程和C#,被分配任务为旧代码编写单元测试,以备大型数据库更改。

我越是了解单元测试,就越怀疑我的方法。

您会如何为以下内容编写单元测试? 目前,我只是在对数据访问层方法进行单元测试,确保它们返回结果?但是显然,单元测试应该独立于任何外部环境?

当几乎所有内容都在调用数据库或存储过程时,我该如何测试我的应用程序?

我的表单代码:

public void button1_Click(object sender, EventArgs e)
{
    LoadAllCountries()
}

private static void LoadAllCountries()
{
    List<nsHacAppMod.ViewCountryInfo> oReturn = moBusinessServices.GetAllCountries();
}

我的数据访问层

public List<nsAppMod.ViewCountryInfo> GetAllCountries()
{
    List<nsAppMod.ViewCountryInfo> oReturn;

    var oResult = from c in moDataContext.ViewCountryInfos
                  select c;

    oReturn = oResult.ToList();

    return oReturn;
}

我现在对这段代码进行的单元测试,是否可接受?如果不可以,你会如何进行测试?

[Test]
public void LoadAllCountries()
{
    hac.CatalogSamples cs = new hac.CatalogSamples();
    var countries = cs.GetAllCountries().count();

    Assert.GreaterOrEqual(countries 0);
}

1
当你运行测试时,会得到什么结果?这更多是一个主观性的问题,因为并不是每个人都以相同的方式编写“单元测试代码”。其实我想知道有多少开发人员每天都在编写它,但我认为这没有任何问题。然而,我个人还是有些犹豫将“断言”编码放入我的生产环境中。你是否已经搜索了关于单元测试的最佳实践?当进行单元测试时,我会编写三种类型的测试:负面、正面和异常。 - MethodMan
3
单元测试的重要之处在于你正试图“证明”某些事情。你现有的测试“证明”了什么?(cs.GetAllCountries将返回0个或多个记录)这个信息是否有用? - Scott Chamberlain
3
您需要对数据访问方法进行集成测试(即使用外部资源,如数据库的测试),然后您的单元测试仅确保正确调用已经过集成测试的方法。 - reggaeguitar
@DJKRAZE,你不应该把单元测试放在生产代码中,而是应该将它们放在仅在调试模式下构建的类库中。 - reggaeguitar
2
编写单元测试的原因是为了重构而不必担心破坏现有代码。现在它可能完全可见,但如果有人稍后删除它,您希望测试失败以警示您。 - reggaeguitar
显示剩余6条评论
1个回答

2
如果您的上下文基于像IContext这样的接口,那么您可以对数据访问进行单元测试,它可以被伪造,然后您可以仅测试您要测试的代码,如GetAllCountries()方法。
但是,除了try catch之外,没有实际逻辑可供测试。我这样看待它:如果它是一个没有逻辑的属性或方法,它不值得测试。 使用像FakeItEasy这样的模拟框架,我会像这样测试这种方法:
    public class ClassToTest
{
    internal virtual MoDataContext CreateContext()
    {
        return new MoDataContext();
    }

    public List<ViewCountryInfo> GetAllCountries()
    {
        List<ViewCountryInfo> oReturn = null;

        try
        {
            var oResult = from c in this.CreateContext().ViewCountryInfos
                          select c;

            oReturn = oResult.ToList();
        }
        catch (Exception)
        {
        }

        return oReturn;
    }

    [Fact]
    public void Test_GetAllCountries_ResultCountShouldBeGreaterThan0()
    {
        var fakeData = new List<ViewCountryInfo>();
        fakeData.Add(new ViewCountryInfo());

        var sut = A.Fake<ClassToTest>();
        A.CallTo(sut).CallsBaseMethod();
        A.CallTo(() => sut.CreateContext()).Returns(fakeData);

        var result = sut.GetAllCountries();

        Assert.IsTrue(result.Count() > 0);
    }

1
我想提到的另一件事是,伪造东西或测试静态方法真的很难。 - Rick Rat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接