我决定在创建视图助手类时使用单例设计模式.这让我思考; 单例实例是否会在请求中存活?这导致了另一个问题,哪些变量(如果有的话)在Web请求中存活,并且这取决于部署?(Fastcgi,Mongrel,Passenger,......)
我知道Controller实例变量没有持久化.我知道常量是持久的(或重新加载?).但我不知道类变量,类上的实例变量,Eigenclasses,......
我已多次遇到这种困境.我的单元测试是否应该复制他们正在测试的方法的功能以验证其完整性?或者单元测试是否应该尝试使用大量手动创建的输入和预期输出实例来测试方法?
我主要询问的问题是,您测试的方法相当简单,并且可以通过查看代码一分钟来验证其正确的操作.
简化示例(在ruby中):
def concat_strings(str1, str2)
return str1 + " AND " + str2
end
Run Code Online (Sandbox Code Playgroud)
上述方法的简化功能复制测试:
def test_concat_strings
10.times do
str1 = random_string_generator
str2 = random_string_generator
assert_equal (str1 + " AND " + str2), concat_strings(str1, str2)
end
end
Run Code Online (Sandbox Code Playgroud)
我知道大多数时候你测试的方法都不够简单,不能用这种方式来证明这一点.但我的问题仍然存在; 在某些情况下这是一种有效的方法(为什么或为什么不这样做)?
我希望能够根据数据库中的信息动态地将URL映射到控制器.
我正在寻找功能相当的东西(假设一个View
模型):
map.route '/:view_name',
:controller => lambda { View.find_by_name(params[:view_name]).controller }
Run Code Online (Sandbox Code Playgroud)
其他人建议动态重建路由,但这对我不起作用,因为可能有数千个视图映射到同一个Controller
我想知道测试ruby mixin模块的最佳方法,在这种情况下用于ActiveRecord模型,但实际上这是一个普遍的问题,适用于您使用mixin扩展的任何类.
尝试存储 mixin正在扩展的Class的所有必要功能,或者只是测试应用程序中存在和扩展的真实类是否更好?
Stubbing将删除测试的外部依赖性,但它无法在真实情况下测试mixin .如果测试失败,则可能是您的实现或您正在扩展的类已更改或中断.如果使用存根类进行测试,则测试可能会通过,但如果要扩展的类发生更改,则可能会破坏功能.
意见?
在使用任何语言进行测试时,每个人如何表达他们的断言消息?
我看到三种明显的方式:
# assume failure
assert (4-2) == 2, "Subtracting 2 from 4 doesn't equal 2"
# describe success
assert (4-2) == 2, "Subtracting 2 from 4 should equal 2"
# be vauge with failure
assert (4-2) == 2, "Subtracting 2 from 4 is broken"
Run Code Online (Sandbox Code Playgroud)
这显然是一个简单的例子,但你明白了.什么是标准做法?你是做什么?为什么?
我刚刚进入工厂女孩,我遇到了一个困难,我肯定应该更容易.我只是无法将文档扭曲成一个有效的例子.
假设我有以下型号:
class League < ActiveRecord::Base
has_many :teams
end
class Team < ActiveRecord::Base
belongs_to :league
has_many :players
end
class Player < ActiveRecord::Base
belongs_to :team
end
Run Code Online (Sandbox Code Playgroud)
我想要做的是:
team = Factory.build(:team_with_players)
Run Code Online (Sandbox Code Playgroud)
让它为我建立一堆球员.我试过这个:
Factory.define :team_with_players, :class => :team do |t|
t.sequence {|n| "team-#{n}" }
t.players {|p|
25.times {Factory.build(:player, :team => t)}
}
end
Run Code Online (Sandbox Code Playgroud)
但这:team=>t
部分失败了,因为t
它不是真的Team
,它是一个Factory::Proxy::Builder
.我必须将一个团队分配给一名球员.
在某些情况下,我想建立一个League
并让它做类似的事情,创建多个拥有多个玩家的团队.
我错过了什么?
HTTP PUT并不完全是跨浏览器,因此Rails(我使用的是Rails 3)支持使用POST并传递_method
查询参数.这很好,但在发送JSON时它似乎不起作用.
例:
$.ajax({
url: window.location.pathname,
type: 'POST',
contentType: 'application/json',
data: JSON.stringify({_method:'PUT', page:{my_data: 1}),
dataType: 'json'
});
Run Code Online (Sandbox Code Playgroud)
当Rails看到这个时,它不会识别'_method'覆盖,因为它以JSON格式传递(也许转换是稍后的?).Rails返回错误"没有路由匹配......"说它找不到路由(到资源),我假设因为它与REST update = HTTP PUT动词不匹配,我甚至尝试将此附加到URL:?_method=PUT
但得到了相同的结果.
那唯一不似乎工作设置一个HTTP标头:
$.ajax({
url: window.location.pathname,
type: 'POST',
contentType: 'application/json',
data: JSON.stringify({my_data: 1}),
dataType: 'json',
beforeSend: function(xhr){
xhr.setRequestHeader("X-Http-Method-Override","put");
}
});
Run Code Online (Sandbox Code Playgroud)
设置HTTP覆盖标头是最好的方法吗?
在php中,查找和捕获匹配给定正则表达式的所有子字符串相当简单,但是有一种简单的方法可以找到字符串中第一个正则表达式匹配的索引吗?
即我想要像这样运作的东西:
$str = "123456789abcdefgh";
$index = preg_index("#abcd#", $str);
// $index == 9
Run Code Online (Sandbox Code Playgroud) 所以,我已经开始创建一些使用Selenium RC直接在浏览器中测试我的Web应用程序的Ruby单元测试.我正在使用Selenum-Client作为红宝石.我已经为我继承的所有其他selenium测试创建了一个基类.
这会创建大量SeleniumDriver实例,并在每个实例上调用所有缺少的方法.这基本上是并行运行测试.
其他人如何自动化这个?
这是我的实施:
class SeleniumTest < Test::Unit::TestCase
def setup
@seleniums = %w(*firefox *iexplore).map do |browser|
puts 'creating browser ' + browser
Selenium::SeleniumDriver.new("localhost", 4444, browser, "http://localhost:3003", 10000)
end
start
open start_address
end
def teardown
stop
end
#sub-classes should override this if they want to change it
def start_address
"http://localhost:3003/"
end
# Overrides standard "open" method
def open(addr)
method_missing 'open', addr
end
# Overrides standard "type" method
def type(inputLocator, value)
method_missing 'type', inputLocator, value
end
# …
Run Code Online (Sandbox Code Playgroud) 我proc_open
在php中使用启动子进程并来回发送数据.
在某些时候,我想等待进程结束并检索退出代码.
问题是如果进程已经完成,我的调用proc_close
返回-1.对于proc_close
实际返回的内容显然存在很多混淆,我还没有找到一种方法来可靠地确定打开的进程的退出代码proc_open
.
我已经尝试过使用了proc_get_status
,但是当进程已经退出时,它似乎也会返回-1.
我不能proc_get_status
给曾经给我一个有效的退出代码,无论它是如何调用或时.它完全坏了吗?
unit-testing ×5
ruby ×4
php ×2
tdd ×2
testing ×2
ajax ×1
controller ×1
exit-code ×1
factory-bot ×1
http ×1
jquery ×1
persistence ×1
pipe ×1
process ×1
regex ×1
rest ×1
selenium ×1
singleton ×1
url-routing ×1