- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在我的 Node/TypeScript Express 应用程序中,我将配置设置存储在 settings.json
文件中,该文件由 config.ts
作为对象加载和导出。每个使用配置设置的模块都会像这样导入模块:
import Config from './config';
config.ts
看起来像这样(本例已简化):
class Config {
public static get(): any {
const settings = require('settings.json');
return settings;
}
}
export default Config.get();
当应用程序运行时,这一切都工作正常。但是我的 Mocha 测试遇到了问题。在某些测试中,我想在触发应用功能之前更改配置设置(例如 Config.someSetting = 'someValue'
),然后在运行下一个测试之前将配置设置重置回默认值。
我知道我可以手动将每个更改的配置值重置回默认值,但理想情况下我想“重新导入”config.ts
模块,这会将所有配置设置重置为其默认值。我的问题是最好的方法是什么?
我尝试过使用decache并将以下内容添加到 afterEach
中:
decache('./config');
尽管我可以看到 config.ts
不再位于 require 缓存中,但 Config 对象仍然存在,并且它的当前值适用于所有后续测试(config.ts
没有被“重新导入”)。
我做错了什么?
最佳答案
如果在 decache('settings.json') 之后重新评估
,即调用require('settings.json')
,像 decache
这样的缓存管理包应该可以在这种情况下工作)Config.get()
。
由于修改的是settings.json
模块对象,因此应该恢复它。 decache
应直接影响应取消缓存的包,即 settings.json
。如果 Config.get()
没有被多次调用,./config'
以及导入它的每个模块也应该被取消缓存。这使得在这种情况下使用 decache
是不合理的。
这里的问题是配置模块不适合测试。仅静态类是反模式。如果 Config
没有像代码所示那样导出,这也是反模式,因为它提供了一个抽象,在模块导出时不能多次使用。
为了改善这种情况,配置模块应该进行重构,使其能够在导入配置对象后重新评估使用配置对象的模块中的 require('settings.json')
:
export default function getConfig() {
return require('settings.json');
}
getConfig()
应始终按原样使用,不应在使用它的模块顶部分配 const config = getConfig()
,这将使其不可缓存。
目前恢复原始配置的一种方法是修改它,同时保留对现有对象的引用,例如:
afterEach(() => {
decache('./settings.json');
Object.assign(Config, require('./settings.json'));
});
正如所见。 Config.get 抽象没有任何帮助。
转译 ES 模块的另一种方法是直接修补模块对象。由于根据规范,模块对象应该是导出的只读反射(reflect)。预计转译器(包括 TypeScript)会相应地处理模块。这取决于应用程序的构建方式,并且可能无法在任何环境中按预期工作。
import Config from './config';
console.log(Config.foo);
应该被转译为类似的东西
Object.defineProperty(exports, "__esModule", { value: true });
console.log(config_1.default.foo;);
这可能允许动态修改 ES 模块导出(CommonJS 模块默认导出不可能)并影响那些使用 Config 并重新评估的模块部分(例如,在函数内部但不在顶层)模块范围):
afterEach(() => {
decache('./settings.json');
const configModule = require('./config'));
configModule.default = require('./settings.json');
});
关于node.js - 在 Mocha 测试之间重新导入模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50002712/
当我这样做时... import numpy as np ...我可以使用它但是... import pprint as pp ...不能,因为我需要这样做... from pprint import
我第一次尝试将 OpenCV 用于 Python 3。要安装,我只需在终端中输入“pip3 install opencv-python”。当我这样做时,我在 Finder(我在 Mac 上)中看到,在
如果有一个库我将使用至少两种方法,那么以下之间在性能或内存使用方面是否有任何差异? from X import method1, method2 和 import X 最佳答案 有区别,因为在 imp
我正在从 lodash 导入一些函数,我的同事告诉我,单独导入每个函数比将它们作为一个组导入更好。 当前方法: import {fn1, fn2, fn3} from 'lodash'; 首选方法:
之间有什么关系: import WSDL 中的元素 -和- import元素和在 XML Schema ...尤其是 location 之间的关系前者和 schemaLocation 的属性后者的属性
我在从 'theano.configdefaults' 导入 'local_bitwidth' 时遇到问题。并显示以下消息: ImportError
我注意到 React 可以这样导入: import * as React from 'react'; ...或者像这样: import React from 'react'; 第一个导入 react
对于当前的项目,我必须使用矩阵中提供的信息并对其进行数学计算,以及使用 ITK/VTK 函数来显示医疗信息/渲染。基本上我必须以(我猜)50/50 的方式同时使用 matlab 例程和 VTK/ITK
当我看到 pysqlite 的示例时,SQLite 库有两个用例。 from sqlite3 import dbapi2 as sqlite3 和 import sqlite3 为什么有两种方式支持s
我使用 Anaconda Python 发行版:Python 2.7 x64 和 Windows 7 SP1 x64 Ultimate。 当我import matplotlib.pyplot时,我得到
目录 【容器】镜像导出/导入 导出 导入 带标签 不带标签,后期修改 【仓库】镜像导出/导入
我正在寻找一种导入模块的方法,以便我可以从子文件夹 project/v0 和根文件夹 project 运行脚本。/p> 我在 python 3.6 中的文件结构(这就是没有初始化文件的原因) proj
我通常被告知以下是不好的做法。 from module import * 主要原因(或者有人告诉我)是,您可能会导入一些您不想要的东西,并且它可能会隐藏另一个模块中具有类似名称的函数或类。 但是,Py
我为 urllib (python3) 编写了一个小包装器。在if中导入模块是否正确且安全? if self.response_encoding == 'gzip': import gzip
我正在 pimcore 中创建一个新站点。有没有办法导出/导入 pimcore 站点的完整数据,以便我可以导出 xml/csv 格式的 pimcore 数据进行必要的更改,然后将其导入回来? 最佳答案
在 Node JS 中测试以下模块布局,看起来本地导出的定义总是在名称冲突的情况下替换外部导出的定义(参见 B.js 中的 f1)。 A.js export const f1 = 'A' B.js e
我在使用 VBA 代码时遇到了一些问题,该代码应该将 excel 数据导入我的 Access 数据库。当我运行代码时,我收到一个运行时错误“运行时错误 438 对象不支持此属性或方法”。来自我在其他论
我有一个名为 elements 的包,其中包含按钮、trifader、海报等内容。在 Button 类中,我正在执行 from elements import * 这执行正常,当我尝试 print(p
在我长期使用 python 的经验中,我遇到了一个非常奇怪的问题。 提前我想说我想知道为什么会发生这种情况 ,而不是如何更改我的代码或如何修复它,因为我也可以做到。 我正在使用 python2.7.3
我正在更新我的包。但是,我正在为依赖项/导入而苦苦挣扎。我使用了两个冲突的包 - ggplot2和 psych及其功能 alpha当然还有 alpha ggplot2 的对象不同于 alpha psy
我是一名优秀的程序员,十分优秀!