相关疑难解决方法(0)

如何模拟ES6模块的导入?

我有以下ES6模块:

network.js

export function getDataFromServer() {
  return ...
}
Run Code Online (Sandbox Code Playgroud)

widget.js

import { getDataFromServer } from 'network.js';

export class Widget() {
  constructor() {
    getDataFromServer("dataForWidget")
    .then(data => this.render(data));
  }

  render() {
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种方法来测试Widget的模拟实例getDataFromServer.如果我使用单独的<script>s代替ES6模块,比如在Karma中,我可以编写我的测试:

describe("widget", function() {
  it("should do stuff", function() {
    let getDataFromServer = spyOn(window, "getDataFromServer").andReturn("mockData")
    let widget = new Widget();
    expect(getDataFromServer).toHaveBeenCalledWith("dataForWidget");
    expect(otherStuff).toHaveHappened();
  });
});
Run Code Online (Sandbox Code Playgroud)

但是,如果我在浏览器之外单独测试ES6模块(比如使用Mocha + babel),我会写一些类似于:

import { Widget } from 'widget.js';

describe("widget", function() {
  it("should do stuff", function() {
    let getDataFromServer = spyOn(?????) …
Run Code Online (Sandbox Code Playgroud)

javascript unit-testing mocha.js ecmascript-6

133
推荐指数
4
解决办法
5万
查看次数

可以在纯JavaScript中实现只读属性吗?

查看mozilla文档,查看正则表达式示例(标题为"使用匹配结果创建数组"),我们有以下语句:

input:一个只读属性,它反映与正则表达式匹配的原始字符串.

index:只读属性,是字符串中匹配的从零开始的索引.

etc ...是否可以在JavaScript中创建自己的对象,该对象具有只读属性,或者这是特定浏览器实现的内置类型的特权?

javascript browser

43
推荐指数
4
解决办法
3万
查看次数

创建一个对外界只读的属性,但我的方法仍然可以设置

在JavaScript(ES5 +)中,我试图实现以下场景:

  1. 一个对象(其中将有许多单独的实例),每个对象都具有只读属性.size,可以通过直接属性读取从外部读取,但不能从外部设置.
  2. .size必须从原型上的某些方法维护/更新该属性(并且应保留在原型上).
  3. 我的API已经由规范定义,因此我无法对其进行修改(我正在为已定义的ES6对象处理polyfill).
  4. 我大部分时间都试图阻止人们不小心在脚下射击,并且实际上不必有防弹只读(尽管防弹越多越好),所以我愿意妥协一些只要obj.size = 3;不允许直接设置,就可以在侧门进入酒店.

我知道我可以使用在构造函数中声明的私有变量并设置一个getter来读取它,但是我必须移动需要从原型中维护该变量的方法并在构造函数中声明它们(所以他们可以访问包含变量的闭包.对于这种特殊情况,我宁愿不从原型中取出我的方法,所以我正在寻找其他选项可能是什么.

还有什么其他想法(即使有一些妥协)?

javascript getter private-members defineproperty

12
推荐指数
2
解决办法
8041
查看次数

为什么我不能用 sinon 正确地存根 twilio 库?

在我的代码中,我有:

function handleMessage() {
  const twilio = require('twilio')(process.env.TWILIO_ACCOUNT_SID, process.env.TWILIO_AUTH_TOKEN);
  let recordings = twilio.recordings(foundConference.RecordingSid);
  console.log('recordings', recordings);
  return recordings.remove();
}
Run Code Online (Sandbox Code Playgroud)

在我的存根中,我有:

const sinon = require('sinon');
const twilio = require('twilio')(process.env.TWILIO_ACCOUNT_SID, process.env.TWILIO_AUTH_TOKEN);

exports.twilioRecordings = () => {
  console.log('about to stub', twilio.recordings);
  sinon.stub(twilio, 'recordings').returns('here');
  console.log('finished stub', twilio.recordings);

  return;
};
Run Code Online (Sandbox Code Playgroud)

但是,它实际上并没有创建存根函数。它仍然使用原始recordings功能。我究竟做错了什么?

mocking node.js twilio sinon

3
推荐指数
1
解决办法
903
查看次数