部分代码覆盖率C# - Nunit

时间:2013-08-29 20:45:48

标签: c# visual-studio-2010 unit-testing nunit code-coverage

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

首先要说“First Post”以及我在我的开发生涯中仍然非常初级,但我一直是一个相对快速的学习者(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和视图被模拟) -

    [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."));
    }

所以我的问题是,我的代码中缺少的是什么。我还需要进行更多测试,我真的很想找到它。我一直在试图完全理解测试中的内外。测试驱动开发是我的目标。如果有人有任何形式的输入(好的或坏的),我将非常感激。我甚至不介意,如果有人可以把我扔得足够多,那么我就可以开始拉上那个具有我想要的答案的同一个字符串。我希望我已经为你们提供了足够的信息。谢谢!

2 个答案:

答案 0 :(得分:1)

_view被模拟,_view的所有方法都不会对它的参数进行操作,例如FillRelatableAccessGroups将收到它的参数,但不会使用/执行它。

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

如果您需要完整的测试覆盖率,请考虑使用_view的正确实现。 像LINQ: Passing lambda expression as parameter to be executed and returned by method

这样的东西

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

答案 1 :(得分:1)

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