【问题标题】:Recommended Access Modifiers for Testability of Wrapper Methods为包装器方法的可测试性推荐的访问修饰符
【发布时间】:2017-05-09 21:22:37
【问题描述】:

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

例如,我会重构这样的东西:

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

进入这个:

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

如果错误消息包含变量或其他东西,或者类似的东西。

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

有没有首选的方法?

【问题讨论】:

    标签: unit-testing typescript jasmine


    【解决方案1】:

    这是您可以从其他语言转移一些良好做法的机会。

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

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

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

    代码:

    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());
        }
    }
    

    【讨论】:

    • 这很有意义。谢谢!相关问题:您是否会为字符串连接包装器建议一种类似的方法,例如那些基于一个或多个参数组成 url 的方法?
    猜你喜欢
    • 2022-11-18
    • 2015-07-12
    • 2014-03-06
    • 1970-01-01
    • 2011-11-05
    • 2014-09-08
    • 2020-11-01
    • 2015-12-24
    • 1970-01-01
    相关资源
    最近更新 更多