js 文件作为 cypress 中的固定装置未加载

mis*_*mas 2 javascript cypress

如何使用js文件作为fixture?有这方面的例子吗?我在 user-details.js 中尝试过:

data = {
  email: function () {
    const currentTimestamp = new Date().getTime();
    return `test${currentTimestamp}@test.com`
  },
  firstName: 'Max',
  lastName: 'Mustermann',
  street: 'Some Street',
} 
Run Code Online (Sandbox Code Playgroud)

然后在我的规范文件中我这样做:

beforeEach(function () {
    cy.fixture(env + '/user-details').as('userDetails');
  }); 
Run Code Online (Sandbox Code Playgroud)

it同一规范文件的测试块中:

const userDetails = this.userDetails.data;
actions.insertStreet(userDetails.street);
Run Code Online (Sandbox Code Playgroud)

但它说它无法读取未定义的属性“street”。有什么想法如何正确地做到这一点吗?:汗水微笑:

Cla*_*ude 5

我有同样的问题,并且无法将接受的答案与我所看到的情况(在 Cypress 9.2.1 中)完全一致。

事实证明,当一个.js文件作为固定装置给出时,cypresseval()会保存该文件的内容(实际上,它使用eval-with-parentheses),并使用由此产生的任何对象。因此,有可能有一个 file user-details.js,其中好像

[{name: "Bob", age: 30 + 5}]
Run Code Online (Sandbox Code Playgroud)

甚至执行一些“真实”代码:

["Bob", "Rob", "Job"].map((name, index) => ({user: name, age: 20 + index}))
Run Code Online (Sandbox Code Playgroud)

或者

(() => {
    const users = ....
    return users
})()
Run Code Online (Sandbox Code Playgroud)

应该注意的是,它并不像您想要的那么灵活(例如,您不能导入代码、执行异步操作等),但它比没有更重要。

问题是,你是否应该......

老实说,我认为这是一个很好的方法,可以让你的灯具更具人类可读性,能够添加注释和轻松转换。而且您不会被 JSON 的逗号限制所困扰,例如

[
  // have a single user, because blah blah
  {name: "Bob", date_of_birth: new Date(1979, 5, 3).valueOf() / 1000},
]
Run Code Online (Sandbox Code Playgroud)

Date(1979, 5, 3)比某些 unix 时间戳更易于人类阅读(尽管它意味着 6 月 5 日,而不是 5 月 5 日......)

我完全认为.js夹具是做到这一点的好方法(如果它只是将夹具导入为模块并使用默认导出作为项目或其他东西,那就更高兴了,但eval可以接受......),只要因为你生产的东西是恒定的!如果你想要一些动态的东西(或者,可能是一些需要更复杂的东西),那么你最好使用 @seth-lutske 的建议(这意味着在你的情况下,接受的答案就是你所需要的,但是我想记录一下.js固定装置是如何工作的,以防其他人过来)。

说了这么多,为什么 cypress 在这里使用 an 是值得怀疑的eval(),尽管建议的方法是使用window.Function(); 另外,我想知道您是否想冒这样的风险:其他一些开发人员(包括未来的您)决定构建一个从某些外部网站下载您的装置的系统,这意味着您创建了一个很好的安全漏洞....

阅读有关 Javascript 装置的github 问题非常有用(我希望在我自己深入研究这一切之前我已经阅读过);如果您正在寻找一个好的解决方法,请参阅评论。


作为所提问题的具体答案,问题是

[{name: "Bob", age: 30 + 5}]
Run Code Online (Sandbox Code Playgroud)

将准确返回该对象,该对象应该可以在 上访问this.userDetails。因此this.userDetails.data指向该对象中的数据字段,即undefined.

以下内容将起作用:

用户详细信息.js:

["Bob", "Rob", "Job"].map((name, index) => ({user: name, age: 20 + index}))
Run Code Online (Sandbox Code Playgroud)

(或者,如果您想email成为字符串而不是函数:

(() => {
    const users = ....
    return users
})()
Run Code Online (Sandbox Code Playgroud)