Какой набор символов / токенов представляет все, что не является нулевым или неопределенным в javascript? - PullRequest
0 голосов
/ 23 июня 2018

Я пишу модульный тест для функции полезности:

export const isDefined: Function = (value: any): boolean => {
  return !(value == null);
};

Итак, я хочу убедиться, что true возвращается для всех значений, которые являются истинными в Javascript. Есть ли набор значений, которые я могу использовать, которые представляют все такие значения? В настоящее время я использую набор [{}, "", 1] Прямо сейчас так выглядит тест:

import { isDefined } from "utilities/utilities";
import { expect } from "chai";
import "mocha";

describe("isDefined", () => {
  it("should return false for undefined or null arguments", () => {
    expect(isDefined(undefined)).to.be.false;
    expect(isDefined(null)).to.be.false;
  });
  it("should return true for non null or undefined arguments", () => {
    expect(isDefined({})).to.be.true;
    expect(isDefined("")).to.be.true;
    expect(isDefined(1)).to.be.true;
  });
});

Обновление

Реализация функции с типом guard из этого поста

export function isDefined<T>(value: T | null | undefined): value is T {
  return value != null
}

Ответы [ 2 ]

0 голосов
/ 23 июня 2018

В соответствии с моими комментариями я бы написал следующую функцию:

function isUndefined(value) {
  return typeof value === 'undefined';
}

function isDefined(value) {
  return !isUndefined(value);
}

Я оставлю вам перевод на es6.

С точки зрения вашего первоначального вопроса о наборе определенных значений, вы правы в том, что вы предложили при тестировании 1, и не беспокоитесь об остальной части набора целых чисел.

В TDD это обычно называется разделом эквивалентности. Вы действительно хотите проверить границы эквивалентных разделов, так как именно здесь ошибка проявляется. Еще одним хорошим тестом, по крайней мере, для чисел, будет -1, так как он находится на другой стороне границы 0.

С точки зрения ваших тестов вы должны действительно попытаться убедиться, что у вас есть одно утверждение для каждого теста или, по крайней мере, одно логическое утверждение, т.е. все ожидаемые операторы тестируют ожидаемое состояние после вызова тестируемого метода. В ваших тестах я вижу, что вы проверяете некоторые правдивые и ложные вещи в каждом тесте. Ваши имена тестов могут быть более четкими, и тест может быть лучшим примером намерения, заданного вашими именами тестов. Другие вещи для проверки на isDefined были бы такими как массив, строка, свойство объекта. Я не могу думать ни о чем другом прямо над головой.

0 голосов
/ 23 июня 2018

Как насчет:

export const isDefined: Function = (value: any): boolean => {
  return !!value;
};

или если это слишком волшебно:

export const isDefined: Function = (value: any): boolean => {
  return value == true;
};

Это также удовлетворит ваш тест, но, возможно, не ваше определение в вашем вопросе.

export const isDefined: Function = (value: any): boolean => {
  return value !== undefined && value !== null;
};

Это то, что я ожидаю от функции, основываясь на ее названии:

export const isDefined: Function = (value: any): boolean => {
  return value !== undefined;
};

Редактировать

Контрольные примеры из авторитетного источника(MDN) для фальши и правды:

Вот официальный экскриптисточник:

...