我正在使用mocha chai运行typescript单元测试(在将编译器选项设置为ts-node之后)。
在我的一个单元测试中,我想获得我创建的实用程序类的所有方法,并对它们运行相同的测试。 更具体一点,我想实现这样的目标:
UtilityClass.getMethods().forEach(method=>{method(sameInputData)})
有没有办法优雅地实现getMethods?或许,另一种解决这种需求的方法是什么?
答案 0 :(得分:5)
你忘了TypeScript是Javascript。请记住,TypeScript编译器会将您的代码编译为Javascript。
因此,正如您通常在Javascript中所做的那样,您可以枚举像这样的对象上的成员:
UtilityClass myclass = ...;
for (var member in myclass) { /* do something */ }
如果你想确保你没有得到继承成员:
for (var member in myclass) {
if (myclass.hasOwnProperty(member)) {
/* do something */
}
}
如果您想确保只获得方法(功能):
for (var member in myclass) { // For each member of the dictionary
if (typeof myclass[member] == "function") { // Is it a function?
if (myclass.hasOwnProperty(member)) { // Not inherited
// do something...
}
}
}
正如您所看到的,这些方法需要一个实例来处理。你没有在课堂上工作。反思是你想要实现的,但在Javascript中并非如此。
答案 1 :(得分:2)
Andry的答案适用于ES3 / ES5,但如果你使用ES6和继承,事情会变得很奇怪......
这是一个更复杂的例子,以及如何在ES6的情况下检索每种类型的方法:
class ParentTest {
parentFoo = function() {
// do stuff
}
parentBar() {
// do stuff
}
}
class Test extends ParentTest {
foo = function() {
// do stuff
}
bar() {
// do stuff
}
}
let instance = new Test();
// These two works equally for every method declared as a property of type "function"
for(let method in instance) {
console.log(method); // foo, foo2
}
console.log(Object.keys(instance)); // Array [ "parentFoo", "foo" ]
// This works for method of the class
let protoOfTest = Object.getPrototypeOf(instance);
console.log(Object.getOwnPropertyNames(protoOfTest)); // Array [ "constructor", "bar" ]
// This works for methods of the extended class
let protoOfParentTest = Object.getPrototypeOf(protoOfTest);
console.log(Object.getOwnPropertyNames(protoOfParentTest)); // Array [ "constructor", "parentBar" ]
答案 2 :(得分:2)
我很难获得其他答案。他们也没有提供没有实例的方法,如果这样做对我有帮助的话。
这是我想出的:
SomeClass.ts
import { route } from "../../lib/route_decorator";
export class SomeClass {
index() {
console.log("here");
}
}
还有somefile.ts
let ctrl = require("./filepath/filename");
// This is because angular exports as `exports.SomeClass = SomeClass;`
ctrl = ctrl[Object.keys(ctrl)[0]];
let ctrlObj = new ctrl();
// Access from Class w/o instance
console.log(Reflect.ownKeys(ctrl.prototype));
// Access from instance
console.log(Reflect.ownKeys(Object.getPrototypeOf(ctrlObj)));
这有效,输出:
[ 'constructor', 'index' ]
[ 'constructor', 'index' ]