Хороший способ избавиться от ошибки линтера no-unused-expressions с помощью chai

В своих тестах Chai я часто обнаруживаю, что хочу использовать их утверждения, которые представляют собой что-то вроде .to.be.empty, .to.be.true и т. д., потому что я нахожу их более понятными для чтения, чем .to.be.length(1) или .to.be.equal(true). Однако это ломает мой линтер (я использую линтер Airbnb по умолчанию).

Я мог бы использовать синтаксис // disable-eslint-line, но тогда мне пришлось бы добавлять его в каждую строку, которая читается так, а это кажется утомительным.

Я также читал о библиотеке DirtyChai, но это потребовало бы от меня повторного изучения всего моего Библиотека тестирования, добавляющая скобки ко всем им, что кажется чем-то, что мне не нужно делать, просто чтобы заставить мой линтер передать что-то, с чем, вероятно, все должно быть в порядке в первую очередь.

Кто-нибудь знает более приятный способ справиться с этим, чем способы, которые я изложил выше?


person Ben Hare    schedule 01.06.2016    source источник
comment
Чтобы было ясно, то, что делает Chai, следует считать ошибкой.   -  person William Entriken    schedule 28.07.2021


Ответы (6)


Вы можете отключить правило для всего файла, используя eslint-disable вверху рассматриваемого файла:

/* eslint-disable no-unused-expressions */
expect(someTrueValue).to.be.true; 

Однако добавление этого в начало каждого тестового файла может быть утомительным. Чтобы отключить это правило для всех соответствующих файлов, вы можете:

  1. Поместите новый .eslintc файл конфигурации в тот же каталог, что и ваш тест. файлы, настроенные на отключение этого правила. Это позволяет вам использовать конфигурацию по умолчанию для всех остальных правил, игнорируя это правило только для файлов в этой папке. ESLint называет это Configuration Cascading.

    {
        "rules": {
            "no-unused-expressions": "off"
        }
    }
    
  2. Используйте ключ overrides в основном файле .eslintrc для отключить правила для групп файлов с сопоставлением шаблонов:

    {
        "overrides": [
            {
                "files": ["*.test.js", "*.spec.js"],
                "rules": {
                    "no-unused-expressions": "off"
                }
            }
        ]
    }
    

Это также позволяет отключить другие правила, которые вызывают затруднения при тестировании, например no-underscore-dangle при использовании rewire.

person Nick Bartlett    schedule 12.06.2016
comment
Это действительно крутая функция (каскадирование конфигурации). Я не знал об eslint, спасибо! Не идеальное решение для того, что я хотел бы, поскольку мне бы хотелось, чтобы оно заботилось только об этих конкретных случаях использования, но этого достаточно для того, что я пытаюсь сделать. - person Ben Hare; 12.06.2016
comment
Почему этот ответ о no-underscore-dangle? Можете ли вы объяснить, что нужно указать в .eslintrc, чтобы ответить на исходный вопрос оператора? - person Jim; 07.05.2018

Только что нашел еще один вариант, используя относительные шаблоны Glob:

В вашем файле .eslintrc:

overrides: [
    {
        files: "*.test.js",
        rules: {
          "no-unused-expressions": "off"
        }
    }
]
person jonalvarezz    schedule 25.09.2017

Я сделал небольшой плагин под названием eslint-plugin-chai-friendly, который переопределяет правило no-unused-expressions по умолчанию. и делает его дружелюбным по отношению к чаю. Измененное правило игнорирует операторы expect и should, сохраняя поведение по умолчанию для всего остального.

person Ihor Diachenko    schedule 20.04.2017
comment
+1. Это должен быть принятый ответ, потому что это означает, что вам не нужно отключать правило для всего тестового файла (так что вы все равно получаете преимущества правила, когда оно применяется). Спасибо за плагин! - person Jules Dupont; 06.02.2018
comment
Если вы пишете машинописный текст, теперь для tslint в npm есть аналогичный плагин: tslint-no-unused-expression-chai. - person GaryO; 06.05.2019

Объединение jonalvarezz answer с Игоря Дьяченко answer дал мне именно то, что я хотел:

npm install --save-dev eslint-plugin-chai-friendly

// .eslintrc.js
module.exports = {
  // ...
  plugins: ['chai-friendly'],
  overrides: [{
    files: '*.test.js',
    rules: {
      'no-unused-expressions': 'off',
      'chai-friendly/no-unused-expressions': 'error',
    },
  }],
  // ...
}

Таким образом, правило no-unused-expression будет переопределено только в файлах *.test.js, а правило no-unused-expression все еще будет действовать для обнаружения любых неиспользуемых выражений в тестовых файлах, не связанных с chai.

person Scott Rudiger    schedule 13.09.2018
comment
Отличная идея. Разве не должно быть включено второе правило в вашем примере кода? я. е. 'chai-friendly/no-unused-expressions': 2 - person dmudro; 05.11.2018
comment
Ты прав. Я оглянулся на свой код, и он у меня есть как chai-friendly/no-unused-expressions': 'error'. Не стесняйтесь отправлять изменения, или, если нет, я сделаю это через несколько дней. - person Scott Rudiger; 06.11.2018

Если кто-то наткнулся на это сегодня, у меня была такая же проблема, и я нашел это решение на документация eslint. В вашем конфигурационном файле eslint вы можете указать одно или несколько окружений, которые будут предопределять глобальные переменные для этого окружения. Для нас это будет mocha, и вы должны настроить его в своем .eslintrc.json следующим образом:

{
    "env": {
        "mocha": true
    },
    ...
    ...
    ...
}

В результате он удалит все ложные срабатывания о мокко describe, it, beforeEach и т. д. без необходимости полностью отключать eslint или полностью отключать какое-либо конкретное правило.

Протестировано с ESLint v.4.11 и mocha 5.0

person Pierre-Adrien    schedule 14.02.2018
comment
Это правильно. По моему опыту, утверждение Chai все равно потерпит неудачу, поскольку Chai и Mocha — это две разные вещи, поэтому вы хотите позаботиться об этом отдельно. Ответ Скотта выше кажется наиболее эффективным решением для Chai. - person dmudro; 07.11.2018
comment
Это не отвечает на вопрос о методах Chai should() и assert. - person GrayedFox; 21.02.2019

У меня была эта проблема с tslint, и я решил ее, просто переместив правило для неиспользуемых выражений на один уровень ниже. В моем ./tslint.json есть все остальные правила, которые мне небезразличны, затем я создал ./src/tslint.json, который просто выглядит

{
    "rules": {
        "no-unused-expression": true
    },
    "extends": "../tslint.json"
}

tslint автоматически проверяет файл конфигурации на каждом уровне по мере спуска по дереву (с --project или с использованием расширения VSCode), поэтому это означает, что в моих тестах (под ./test/) применяются все остальные правила, но no-unused-expression применяется только к файлам под ./src/.

person Coderer    schedule 01.08.2019