这是一个简单的例子,说明了我的问题的关键:
var innerLib = require('./path/to/innerLib');
function underTest() {
return innerLib.doComplexStuff();
}
module.exports = underTest;
Run Code Online (Sandbox Code Playgroud)
我正在尝试为此代码编写单元测试.如何在innerLib不require完全嘲笑函数的情况下模拟出对该函数的要求?
编辑:所以这是我试图模拟全局需求,并发现它甚至不会这样做:
var path = require('path'),
vm = require('vm'),
fs = require('fs'),
indexPath = path.join(__dirname, './underTest');
var globalRequire = require;
require = function(name) {
console.log('require: ' + name);
switch(name) {
case 'connect':
case indexPath:
return globalRequire(name);
break;
}
};
Run Code Online (Sandbox Code Playgroud)
问题是requireunderTest.js文件中的函数实际上没有被模拟出来.它仍然指向全球require功能.所以我似乎只能underTest.js在同一个文件中模拟我正在进行模拟的函数.如果我使用全局require来包含任何内容,即使在我重写本地副本之后,所需的文件仍将具有全局require引用.
例如,在本文中:
Lorem ipsum dolor坐下来,精致的adipistur elit.Nunc eu tellus vel nunc pretium lacinia.Proin sed lorem.Cras sed ipsum.Nunc a libero quis risus sollicitudin imperdiet.
我想在'ipsum'之后匹配这个词.
鉴于这种非常熟悉的原型构造模型:
function Rectangle(w,h) {
this.width = w;
this.height = h;
}
Rectangle.prototype.area = function() {
return this.width * this.height;
};
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释为什么呼叫new Rectangle(2,3)持续比Rectangle(2,3)没有'new'关键字呼叫快10倍?我会假设因为new会通过涉及原型来增加函数执行的复杂性,所以它会更慢.
例:
var myTime;
function startTrack() {
myTime = new Date();
}
function stopTrack(str) {
var diff = new Date().getTime() - myTime.getTime();
println(str + ' time in ms: ' + diff);
}
function trackFunction(desc, func, times) {
var i;
if (!times) times = 1;
startTrack();
for (i=0; i<times; i++) {
func();
}
stopTrack('(' + times …Run Code Online (Sandbox Code Playgroud) 以下是直接从JavaScript的权威指南中描述JavaScript中的"类"或构造函数的教科书标准方法:
function Rectangle(w,h) {
this.width = w;
this.height = h;
}
Rectangle.prototype.area = function() {
return this.width * this.height;
};
Run Code Online (Sandbox Code Playgroud)
我不喜欢这里的悬空原型操作,所以我试图想出一种方法来封装area构造函数内部的函数定义.我想出了这个,我也没有想到的工作:
function Rectangle(w,h) {
this.width = w;
this.height = h;
this.constructor.prototype.area = function() {
return this.width * this.height;
};
}
Run Code Online (Sandbox Code Playgroud)
我没想到这个工作,因为this内部参考area函数应该指向area函数本身,所以我不会有访问width和height从this.但事实证明我做到了!
var rect = new Rectangle(2,3);
var area = rect.area(); // great scott! it is 6
Run Code Online (Sandbox Code Playgroud)
一些进一步的测试证实,函数this内部的引用area实际上是对正在构造 …
在将其用作字典元素之前,是否必须正式定义函数?
def my_func():
print 'my_func'
d = {
'function': my_func
}
Run Code Online (Sandbox Code Playgroud)
我宁愿定义内联函数.我只是尝试输入我想要做的事情,但是python语法的空白策略使得在dict中定义内联函数变得非常困难.有没有办法做到这一点?
可以在myInnerFunction下面测试吗?
var val = function() {
var myInnerfunction = function(input) {
return input + ' I ADDED THIS';
};
return myInnerfunction('test value');
}();
Run Code Online (Sandbox Code Playgroud)
因为myInnerFunction它本质上是匿名执行的外部函数的私有成员,所以它似乎不是从外部可测试的.
如果用户创建没有方法属性的表单,似乎大多数浏览器将在表单提交时处理此问题.因此,在DOM准备好之后检查表单元素时,您可以看到表单元素对象没有"方法"attr.
但是,IE7显然在没有方法值的所有表单上设置了"GET"的默认方法值.我不想争论GET或POST是否是最合理的默认值,我只是想找到一种方法使POST成为所有浏览器的默认表单方法.
我的问题是我无法判断用户是否为表单方法输入了"GET"值,或者IE是否将该值注入默认值.如果表单没有方法属性,很明显用户没有指定一个,所以我可以安全地将其默认为POST.但是如果我看到一个表单方法的GET值,我无法判断用户是否指定了它,或者它是否为黑色并且IE7在解析HTML时设置了GET.
有人有主意吗?
这是一个lisp过程,简单地将'a'添加到'b'的绝对值:
(define (a-plus-abs-b a b)
((if (> b 0) + -) a b))
Run Code Online (Sandbox Code Playgroud)
我认为这很漂亮,我试图找到用JavaScript编写这个的最好方法.但我的JavaScript代码不漂亮:
var plus = function(a,b) {
return a + b;
};
var minus = function(a,b) {
return a - b;
};
var aPlusAbsB = function(a,b) {
return (b > 0 ? plus : minus)(a,b);
}
Run Code Online (Sandbox Code Playgroud)
主要问题是我不能使用+和-符号作为他们真正代表的函数的引用,因为我可以使用lisp.任何人都可以想出更优雅的方式来做这样的事情,或者我是否达到了语言界限?
显然,我可以这样做:
var aPlusAbsB = function(a,b) {
return a + Math.abs(b);
}
Run Code Online (Sandbox Code Playgroud)
,但这更像是一个思想实验,而不是一个实用的问题.
有没有什么方法可以引用JavaScript语言中的核心函数,就像它们是用户定义的一样?
javascript ×6
browser ×1
class ×1
constructor ×1
dom ×1
lisp ×1
lookbehind ×1
mocking ×1
node.js ×1
python ×1
regex ×1
scheme ×1
testing ×1