2013-08-29 7 views
3

У меня есть частичное покрытие кода, и я не знаю почему. для людей, которым нравится этот вопрос, прежде чем они начинают читатьПокрытие частичного кода C# - Nunit

Хотите начать говорить «First Post», а также я до сих пор очень Юниор в моей карьере развития, но я был relativly быстро обучаемый (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."); 
     } 

    } 

Код, который тестирует «если» и «остальное» заявление (при условии, репо и вида высмеивает) -

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

Так что мой вопрос в том, что мне не хватает в моем коде. Что-то еще происходит, что мне нужно протестировать, и я действительно хотел бы его найти. Я был в порядке, пытаясь в полной мере разобраться в тестах и ​​тестах. Разработка Test Driven - моя цель. Если у кого-то есть какой-либо вход (хороший или плохой), он будет очень признателен. Я бы даже не возражал, если бы кто-то мог наброситься на меня достаточно, поэтому я могу начать натягивать эту метофорическую строку, которая имеет ответ, который я ищу, привязан к концу. Надеюсь, я предоставил достаточно информации для всех вас. Благодаря!

+0

Какая часть кода nunit говорит, что ваши тесты не покрываются? – Mike

+0

Его команда, которая заявляет, что она не покрыта. Тесты Nunit проходят. У меня есть комментарии в коде выше, указывающем код. – Eric

+0

Вы утверждаете, что вызывается 'r.Delete()'. Этот код не тестируется. Кроме того, я не вижу, где вы назначаете данные для возврата из '_agRepo.GetAll()'. Если вы настроили его для возврата нулевых элементов, тогда 'x.IsRelatable' не будет оцениваться. У вас есть nUnit, чтобы игнорировать покрытие простых свойств get/set? –

ответ

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% + наиболее важных мест может быть гораздо более ценным.

+0

Ничего себе, спасибо за полный ответ. Завтра я увижу, что покрывается, когда я нахожу средство для правильного внедрения _view и теста. Я лично знаю и уважаю правило 90%. Однако я стараюсь расширить свое понимание модульных тестов, а также автоматическое тестирование. Какой лучший способ понимания, чем делать? Мне нравится практиковать и ломать, зная, почему и почему эта проблема - единственный способ приблизиться к тому, чтобы быть хорошо разбирающимся в контексте вашего изучения. Ждем завтра тест. Каковы некоторые способы узнать, какой код стоит покрывать над другими? – Eric

+0

Также для уточнения _view, на которое вы ссылаетесь, является (я не знаю правильный термин) «активным» кодом? Или вы говорите тестовый код? Я полагаю, вы имеете в виду активный код. – Eric

+1

Отлично, продолжайте разрывать код :). Относительно вопроса к _view. Если у вас есть производственный код, который работает в модульном тесте, не стесняйтесь его использовать. Если производственный код имеет внешние зависимости, которые вам не нужны в модульном тесте, например, используя любое устройство, базу данных, файл, тогда вам нужно создать вариант тестирования или исправить зависимость. Надеюсь, это имеет смысл. –

1

Отказ от ответственности: Я пытаюсь использовать термины правильно, не стесняйтесь, чтобы исправить меня, если я неправильно использую условия, пожалуйста, я не могу подчеркнуть тоску, которую я испытываю для «разучивания» чего-то, что я впитал неправильно. Я считаю, что нашел свое решение. Текущее представление не издевается над методом IEnumerable Where, поскольку это статический метод. Я использую RhinoMocks и RhinoMocks, библиотека не является сильной/большой, чтобы обрабатывать эти системные методы (правильный термин?). Вы можете создать метод виртуального экземпляра в другом классе, чтобы обернуть статический метод внутри, что позволит вам наконец-то высмеять метод IEnumerable Where. Я нашел здесь свои ответы по этой ссылке: Mocking Static methods using Rhino.Mocks