我正在Mocha中编写打字稿测试,并定义了这样的测试:
describe("IsDefined", () => {
it("should work right ...", () => {
class Test {
@IsDefined() p1: String = "";
@IsDefined() p2: Date = new Date();
@IsDefined() p3: Number = 0;
}
然后在同一describe
块中的另一个测试中,我重新定义Test
类,如下所示:
it("should have accurately mapped ValidationContext values.", () => {
const options: ValidationOptions = {
each: true,
message: "Wazzzzaaaaaaapppppp????!!!!"
};
class Test {
@IsDefined(options) p1: String = "";
@IsDefined(options) p2: Date = new Date();
@IsDefined(options) p3: Number = 0;
}
const instance = new Test();
那没有用。不知何故,早期的Test
方法中的it
类仍用于创建我正在创建的instance
,因此看不到传递给装饰器的选项。
如果我将类重命名为Test2
,那么我会得到正确的结果,但我宁愿不必对安装程序中使用的类依赖正确的命名。
在每种it
方法之前设置正确的正确方法是什么?
答案 0 :(得分:0)
Mocha不会尝试将打字稿类定义隔离到特定的测试范围实际上是一件好事。例如,如果在运行时加载同一类的多个定义,则在类实例上运行的装饰器可能会产生无效状态。这是在我使用上面的代码时发生的,结果我得到了更好的缓存设计。在这里:
/**
* If the ValidationContext instance is absent it is created, otherwise
* the context is placed in the cache specific to the class decorated.
* @param key
* @param vc
* @throws Error if attempting to add a ValidationContext that has already been added
*
* The exception thrown indicates that duplicate class definition exist in the runtime.
*/
private static pushIfAbsent(key: string, vc: ValidationContext):void {
if (this.cache[key] == null) {
const validationContextMap: IValidationContextIndex = {};
validationContextMap[vc.getSignature()]= vc;
this.cache[key] = validationContextMap;
} else {
if (this.cache[key][vc.getSignature()]) {
throw new Error(`The ValidationContainer already contains context with signature ${vc.getSignature()}.`);
}
this.cache[key][vc.getSignature()]=vc;
}
}
因此,我认为这是Mocha功能,而不是bug。如果在多个测试用例中定义相同的类,则将产生重复的运行时定义,并且可以用于测试装饰器对存储装饰器实现结果的状态的影响。
因此,确保您没有同一个类的多个运行时实现的最佳方法是像在所有其他类实现中一样,将其定义在一个位置并导入。