2014-12-22 5 views
2

Когда модуль тестирует результат и/или побочные эффекты от одного логического действия, как вы храните код DRY? Рассмотрим следующий пример, написанный на Жасмин:В стиле теста Arrange-Act-Assert, нормально ли переместить Act в блок beforeEach/setUp?

describe("frobnicate", function() { 
    var foo; 

    beforeEach(function() { 
    foo = getFoo(); 
    }); 

    it("causes side-effect 1", function() { 
    frobnicate(foo); 

    expect(sideEffect1).toEqual('you did it'); 
    }); 

    it("causes side-effect 2", function() { 
    frobnicate(foo); 

    expect(sideEffect2).toHaveBeenCalled(); 
    }); 

    /* side effect 3, 4, etc. */ 
}); 

Уведомление повторный Закон о с призывами к frobnicate(foo). В рамках модульного тестирования, что позволяет вложенным описать контексты (например, жасмин), кажется, очень естественно рефакторинг тесты по линиям:

describe("frobnicate", function() { 
    beforeEach(function() { 
    var foo = getFoo(); 

    frobnicate(foo); 
    }); 

    it("causes side-effect 1", function() { 
    expect(sideEffect1).toEqual('you did it'); 
    }); 

    it("causes side-effect 2", function() { 
    expect(sideEffect2).toHaveBeenCalled(); 
    }); 

    /* test side effect 3, 4, etc. */ 
}); 

Является ли этот стиль каким-либо образом противоречит стилю тестирования ААА? Рефакторинг кода таким образом вызывает другие проблемы?

ответ

3

Не только это не противоречит Arrange-Act-Assert, но я бы настаивал на том, чтобы вы do сделали это так. Дублирование в тестах является одной из основных проблем обслуживания, и удаление должно выполняться как можно больше.

Самый большой вопрос, который нужно задать для дублирования, - «что произойдет, если это изменится?», Если вам нужно изменить его в нескольких местах, рефакторинг.

+0

Прохладный, звучит хорошо для меня. –

1

Нет, все не в порядке. Да, установка Закона на этапе настройки вызывает проблемы или предполагает, что вы уже можете столкнуться с проблемным путем.

Люди обычно хотят это сделать, потому что считают, что им разрешено только одно утверждение за тест. Они считают, что для тестирования данной комбинации Arrange и Act требуется более одного утверждения, поэтому они пишут тест для каждого утверждения. Теперь комбинация Arrange-Act дублируется, поэтому они перемещают ее на шаг настройки. Но теперь у них есть новые проблемы:

  • тесты, написанные таким образом, часто требуют много синтаксиса сказать, что можно было бы сказать гораздо больше, просто поместив все утверждения в том же тесте.

  • Если Arrange и/или Act принимают любое время для запуска, в настоящее время существует много медленных тестов вместо одного.

  • Все тестовые рамки, которые я использовал, называют их шаги настройки «до», «setUp» и т. Д., Без сомнения, потому что их авторы думали об использовании этих шагов для организации, а не закона. Если вы пытаетесь написать тесты, которые хорошо читаются, противоречивый язык сотрясается.

Итак, я обычно пишу один тест для каждой отдельной пары Arrange-Act и использую столько утверждений, сколько мне нужно в этом тесте.