Как проверить функцию, связанную с JavaScript

Есть ли способ проверить функцию, связанную с JavaScript?

Я хочу вернуть связанную функцию из функции и в модульном тестировании, чтобы утвердить target связанной функции, boundThis и boundArgs. Кажется, они определены как внутренний объект в ECMAScript и не могут быть доступны в программе.

Есть ли способ получить к ним доступ? или, может быть, некоторые люди с похожими требованиями уже написали некоторые исправления модуля Function.prototype.bind ()?

 deceze20 июл. 2016 г., 13:30
FWIW ... в модульных тестах вы обычно хотите проверитьчто делает кусок коданекак это делает это. «Что» - это тест, «как» - это реализация. Кажется, это не то, на чем нужно фокусироваться в модульном тесте.
 user66303120 июл. 2016 г., 15:01
Увидетьstackoverflow.com/questions/26545549/...,this используется, когда вызванная функция не является скрытым свойством функции. Это часть логики, используемой для переноса исходной функции для создания связанной функции. Вы не можете проверить это так же, как вы можете проверить локальную переменную в функции или любую другую логику, внутреннюю для функции, и, как справедливо указывает @Bergi, вы не хотите и не должны этого делать.

Ответы на вопрос(1)

Решение Вопроса

Вы не должны проверять связанные функции в любом случае. Вы могли бы достичь точно такого же поведения с замыканием, которое также не открывало бы закрытые переменные. И это не имеет значения. Вы должны проверять не реализацию, а поведение - поэтому просто проверьте, вызывает ли возвращаемая функция целевой объект с ожидаемыми значениями.

 matianfu21 июл. 2016 г., 15:27
Спасибо за ответ.
 Bergi21 июл. 2016 г., 15:57
Да, тип обещанияMonad, Но это не делает его нечистым или даже гарантирует побочные эффекты. Да, вы не можете определитьEq на нем (без учета идентичности объекта), но на самом деле вы не можете сделать то же самое с функциями. «Связанная функция» (что бы это ни было), которая соответствует обещаниям 1: 1, равна обещаниям для всех целей.
 matianfu21 июл. 2016 г., 15:34
Но я определенно не согласен с вами в том, что связанные функции не следует тестировать. В наше время обещания ES6 часто используются. Многие функции возвращают обещания. Но обещание - это непрозрачный объект, нет способа проверить, что такое обещание, нет способа сделать проверку равенства по значению. Лучший способ - вернуть связанную функцию, если она может быть проверена. Это гораздо лучше, чем выполнить обещание и подтвердить результат, поскольку обещание, вероятно, имеет побочный эффект. Сохранение протестированной функции «чистой» является ключом к проблеме.
 matianfu21 июл. 2016 г., 16:30
В большинстве случаев обещание оборачивает (возможно и вероятно) анонимную функцию, но если мы даем этой функции имя, мы можем отделить чистую функцию и нечистую функцию. Во многих случаях нечистым является файл node.js или сторонние библиотеки, которые мы не хотим тестировать. Тогда мы можем проверить только чистую часть. Я считаю это огромным преимуществом в тестировании по сравнению с утверждением разрешенного значения из нечистых, исполняемых или сторонних библиотечных функций.
 Bergi21 июл. 2016 г., 15:57
Похоже, вы ищете реализацию монады ввода-вывода, которая оборачивает не только асинхронность (как это делают обещания), но и побочные эффекты. Конечно, для этого есть библиотеки, но на самом деле ваша монадическая композиция функций просто останется композицией функций, создавая непрозрачные функциональные объекты. Единственный способ проверить функции на равенство - запустить их. Единственное, что отличается отPromise к такомуIO Монада в том, что вы можете содержать (и издеваться) побочные эффекты
 matianfu21 июл. 2016 г., 15:44
Кроме того, предположим, что такая функция адаптера называется M (). Он принимает объект, представляющий связанную функцию, и возвращает обещание, затем в цепочке Promise / then / catch. все чистые функции оборачиваются функцией M и затем передаются в then или catch. Еще одним преимуществом этого подхода является то, что если вы хотите протестировать покрытие кода, вам не нужно имитировать какую-либо побочную функцию внутри обещания, все, что вам нужно сделать, - это изменить поведение функции M, проверяя ввод и вывод тестовых данных как результат. Не могу сказать, что обещание плохое, но оно пошло только наполовину к функциональному программированию.
 matianfu21 июл. 2016 г., 15:39
Обещание - это что-то вроде монады в Хаскеле, в том смысле, что оно содержит значение. Но само по себе это не ценность. Это проблема. и функции, возвращающие его, не могут быть чистыми. Обходное решение использует объект, представляющий связанную функцию, в качестве возвращаемого значения вместо обещания. Это может быть преобразовано в обещание без двусмысленности. Тогда этот объект может быть утвержден напрямую, а не разрешать обещание. Функции возврата такого объекта могут быть чистыми.

Ваш ответ на вопрос