3

我有部分代码覆盖率,我不知道为什么。对于在开始阅读之前喜欢这个问题的人

想先说“第一篇文章”,而且我在我的开发生涯中仍然非常初级,但我一直是一个相对快速的学习者(imo),所以就这样吧。使用 Nunit 进行测试,基于 MVP。

要测试的代码 -

void _view_Delete(object sender, EventArgs<Guid> e)
    {
        _agRepo.Delete(_agRepo.GetByID(e.Value));

        var g = _agRepo.GetAll();
        if (g.Count() > 0)
        {
            _view.FillRelatableAccessGroups(g.Where(x => x.IsRelatable));//partial coverage
            _view.FillStandAloneAccessGroups(g.Where(x => !x.IsRelatable));//partial coverage
        }

        else
        {
            _view.ShowErrorMsg(true, "No Access Groups Found.");
        }

    }

测试“if”和“else”语句的代码(假设 repo 和 view 被模拟)-

    [Test]
    public void TestDelete()
    {
        _view.Raise(v => v.Delete += null, this, new EventArgs<Guid>(1.ToGuid()));
        _agRepo.AssertWasCalled(r => r.Delete(_agRepo.GetByID(1.ToGuid())));
        _view.AssertWasCalled(v => v.FillRelatableAccessGroups(Arg<IEnumerable<AccessGroup>>.Is.Anything));
        _view.AssertWasCalled(v => v.FillStandAloneAccessGroups(Arg<IEnumerable<AccessGroup>>.Is.Anything));
    }

    [Test]
    public void TestDeleteNoGroups()
    {
        _agList.Clear();
        _view.Raise(v => v.Delete += null, this, new EventArgs<Guid>(1.ToGuid()));
        _agRepo.AssertWasCalled(r => r.Delete(_agRepo.GetByID(1.ToGuid())));
        _view.AssertWasNotCalled(v => v.FillRelatableAccessGroups(Arg<IEnumerable<AccessGroup>>.Is.Anything));
        _view.AssertWasNotCalled(v => v.FillStandAloneAccessGroups(Arg<IEnumerable<AccessGroup>>.Is.Anything));

        _view.AssertWasCalled(x => x.ShowErrorMsg(true, "No Access Groups Found."));
    }

所以我的问题是,我的代码中缺少什么。我需要测试更多的东西,我真的很想找到它。我一直低着头试图完全理解测试的进出。测试驱动开发是我的目标。如果有人有任何类型的输入(好或坏),将不胜感激。我什至不介意有人能把我扔得足够多,这样我就可以开始拉动那根隐喻的弦,它的结尾有我正在寻找的答案。我希望我已经为大家提供了足够的信息。谢谢!

4

2 回答 2

1

免责声明:我正在尝试正确使用术语,如果我不正确地使用术语,请随时纠正我,我不能强调我对“忘记”我错误吸收的东西的焦虑。我相信我找到了我的解决方案。当前视图不模拟 IEnumerable Where 方法,因为它是一个静态方法。我正在使用 RhinoMocks 并且 RhinoMocks 库不够强大/足够大,无法处理这些系统方法(正确的术语?)。您可以在另一个类中创建一个虚拟实例方法以将静态方法包装在其中,从而使您最终能够模拟 IEnumerable Where 方法。我在这个链接中找到了我的答案:Mocking Static methods using Rhino.Mocks

于 2013-09-03T17:09:54.603 回答
1

_view被嘲笑并且 _view 的所有方法都不会对其参数进行操作,例如FillRelatableAccessGroups将接收它的参数,但不会使用/执行它。

这就是为什么g.Where(x => x.IsRelatable)并且g.Where(x => !x.IsRelatable)没有被您的测试覆盖,因为它们永远不会被执行。

如果您需要完整的测试覆盖率,请考虑使用_view. LINQ之类的东西:将lambda表达式作为参数传递给方法执行和返回

要记住的一件事是,没有 TDD 原则告诉您实现完整的测试覆盖率。覆盖 90% 以上的最重要地点可能更有价值。

于 2013-08-29T22:21:20.083 回答