推荐的访问修饰符,用于包装方法的可测试性

时间:2017-05-09 21:22:37

标签: unit-testing typescript jasmine

我在测试中开始做的一件事是将错误消息和字符串连接包装到方法或变量中,以便在错误消息内容稍后更改时保持测试的稳定性。

例如,我会重构这样的事情:

try{
    someMethod();
}catch(e){
    throw new Error('error message.');
}

进入这个:

let errorMessage = 'error message';
...
try{
    someMethod();
}catch(e){
    throw new Error(errorMessage);
}

如果错误消息包含变量或其他内容,则类似。

我的问题是在Typescript中执行此操作的最佳方法是什么?在Java中,我会让它们受到包保护,但是如果受到保护,Jasmine似乎无法访问这样的方法。我也试过让它们变得静止。

是否有首选方法?

1 个答案:

答案 0 :(得分:0)

在这种情况下,您可以从其他语言转移一些好的做法。

如果您创建自定义异常,则可以测试其类型,而不是字符串 - 您还可以确保错误消息的一致性。

这个例子看起来有些复杂,但它应该给你一个想法(改编自第163-168页Pro Typescript)。

  1. 创建了一个基础CustomException类,它实现了Error接口,并且位于我们应用程序中所需的任何自定义错误类型之下。
  2. 创建InvalidDateException来表示特定的错误类,这是错误消息字符串需要存储在应用程序中的唯一位置。
  3. 您现在可以查看特定类型的错误,例如示例catch语句,其中instanceof用于检查类型。
  4. 您的所有自定义例外都与Error界面兼容,后者需要nametoString()
  5. 代码:

    class CustomException implements Error {
        protected name = 'CustomException';
    
        constructor(public message: string) {
        }
    
        toString() {
            return this.name + ': ' + this.message;
        }
    }
    
    class InvalidDateException extends CustomException {
        constructor(public date: Date) {
            super('The date supplied was not valid: ' + date.toISOString());
            this.name = 'InvalidDateException';
        }
    }
    
    try {
        throw new InvalidDateException(new Date());
    } catch (ex) {
        if (ex instanceof InvalidDateException) {
            alert(ex.toString());
        }
    }