首页 > 解决方案 > 将 IF/Else 条件转换为 Ramda Cond 失败

问题描述

使用 Ramda 在 E2E 上工作。我不知道如何使用 Ramda Cond 转换简单的 IF 条件。

使用 If 的代码:

if (constraint == 'required') {
  // then only do something
  await waitForElementToBeClickable(constraintElement);
  await constraint.click();
}

我不想要 else ,因为我希望只有在存在约束的情况下才会发生动作。

到目前为止,我已经使用约束完成了此操作,但它不起作用:

await waitForElementToBeClickable(cond([
  [equals('required'), always(constraintElement)],
])(constraint), this.browser);

const constraintCheck = cond([
  [equals('required'), () => constraintElement.click()],
]);
await constraintCheck(constraint);

在某些情况下,我不想通过约束。然后条件根本不应该执行。但它总是被执行并抛出错误:无法读取未定义的属性“isPresent”。

标签: javascripte2e-testingramda.jsangularjs-e2e

解决方案


我认为这里可能有些混乱(除了 customcommander 正确指出的类型之外constraint。)

Ramda 试图提供的功能之一是允许我们使用表达式而不是语句进行编程。尤其是控制流语句。但是一个看起来像这样的声明:

let foo
if (condition) {
  foo = 'bar'
} else {
  foo = 'baz'
}

已经有一个标准的表达形式:

const foo = condition ? 'bar' : 'baz'

Ramda 并没有真正尝试提供替代方案。但是我们可能会尝试使用另一种方法if

let foo
if (test(val)) {
  foo = bar(val)
} else {
  foo = baz(val)
}

在这里,当使用函数时,Ramda 提供了一种方便的速记:

const getFoo = ifElse(test, bar, baz)
// ... later
const foo = getFoo(val)

(如果你只是想val在测试失败的情况下返回,你可以使用简写:

   const foo = when(test, bar)

或者如果你想val在测试成功时,你可以做

   const foo = unless(test, baz)

)

虽然将代码转换为

const foo = ifElse(test, bar, baz)(val)

这不是重点。基本原理ifElse是在创建可重用函数时使用它ifElse(test, bar, baz)。(cond是一样的,只是提供一系列条件-结果对而不是一个if和一个else。)

请注意其中的一个重要特性:测试函数、如果为真则运行的函数以及如果为假则运行的函数都具有相同的签名。如果其中一个接受三个参数,那么它们都应该接受三个参数。虽然测试应该返回一个布尔值,但其他两个可以有任何返回类型,但每个应该具有与另一个相同的返回类型。

因此,可以使用 thunk,当您尝试使用 时() => constraintElement.click(),它主要是对 Ramda 功能的滥用。它可能不会在您的代码中为您带来任何好处。


目前尚不清楚您要如何处理从if语句到ifElseor的转换cond。请随时为您的问题添加更新,更全面地解释您要做什么,以及您要通过此转换解决什么问题,有人可能会提供一些帮助。但请确保您澄清什么constraintconstraintElement是什么以及waitForElementToBeClickable解决什么。现在它相当混乱。


推荐阅读