我知道rspec --bisect
根据示例运行的顺序来隔离间歇性失败的规范。但我在遗留应用程序中遇到了一个案例(我以前从未在这个代码库中工作过),即使在隔离\xe2\x80\x94 中运行时,规范也会间歇性地失败,因此序列不是一个因素。
换句话说,如果我跑
\nrspec ./spec/services/locate_missing_approver_service_spec.rb:5\n
Run Code Online (Sandbox Code Playgroud)\n它可能会在 10 次中失败 1 次。这个 10% 的数字是根据我运行此程序的经验猜测的,但如果我有一种准确收集这样的统计数据的方法,它可能会很有用,这样我就可以用来git bisect
确定间歇性的位置失败开始。
目前,我正在手动运行一个函数来检查失败是否发生在任何给定的提交或任何临时更改的代码中,并且我可以扩展它来收集统计信息,但我不确定这是否是最好的路径向下。
\nfunction test-flaky-spec() {\n while true; do\n rspec ./spec/services/locate_missing_approver_service_spec.rb:5\n if [[ $? -ne 0 ]]; then\n break\n fi\n sleep 0.1\n done\n}\n
Run Code Online (Sandbox Code Playgroud)\n所以问题实际上可以归结为:
\n对于这种情况,是否有普遍接受的故障排除技术?
\n在Ruby中我可以这样做:
fruit = ['banana','apple','tangerine','orange','lemon','lime','kiwi','mango','guava']
citrus = ['orange','lemon','lime','tangerine']
others = fruit - citrus
Run Code Online (Sandbox Code Playgroud)
而others
将包含非柑橘类水果的数组.
我怎么能用PHP做到这一点?
$fruit = array('banana','apple','tangerine','orange','lemon','lime','kiwi','mango','guava');
$citrus = array('orange','lemon','lime','tangerine');
$others = # NOW WHAT ?????
Run Code Online (Sandbox Code Playgroud)
我是否需要迭代每个项目$citrus
并找到它的偏移量$fruit
(如果它存在于该数组中)然后取消设置它,然后使用array_values()来修复数组的索引?或者是否有更简单,更不容易出错的方式?
我正在尝试自定义 pry 的pryrc
文件,但找不到它。文档说它位于主目录中,但我在那里没有看到它。如果它是不可见的,可以告诉我如何编辑它吗?
有没有办法获取实例方法并将其添加到类中(反之亦然)?
这是我的尝试,但它失败了因为Ruby不让我将实例方法绑定到类:
#!/usr/bin/env ruby
SOMETHING = :a
class SomeClass
def some_method(variable, value)
case SOMETHING
when :c
"output for case C"
when :a, :b
"output for A or B"
end
end
# here's my failed attampt to add some_method to SomeClass:
self.instance_method(:some_method).bind(self)
end
# it works as an instance method
bash = SomeClass.new
puts bash.some_method("EDITOR","vim")
# but not as a class method... yet
puts SomeClass.some_method("EDITOR","vim")
Run Code Online (Sandbox Code Playgroud)
错误是"bind参数必须是SomeClass的实例".换句话说,我不能调用bind(self)
因为self
是类而不是类的实例.
我正在为一个有很多类似路线的应用编写路由,我想保持DRY,所以我想根据URL的一部分选择控制器,但似乎没有办法与Laravel一起做这件事.
这不起作用,因为$report_slug
它不可用.
Route::get('/ad-reports/{report_slug}', array('uses' => Str::title($report_slug).'Controller@showHome'));
Run Code Online (Sandbox Code Playgroud)
如果我使用一个我可以访问的闭包$report_slug
,但我找不到任何替换内容的文档return
,所以这将返回控制器和操作的文本,但显然我想使用该操作.
Route::get('/ad-reports/{report_slug}', function($report_slug) {
return (Str::title($report_slug).'Controller@showHome');
});
Run Code Online (Sandbox Code Playgroud)
如何根据report_slug
?指定控制器?
我想在 Postgres 中更新一个序列,我可以半手动完成,如下所示:
SELECT MAX(id) as highest_id FROM users;
ALTER SEQUENCE users_id_seq RESTART WITH 11071;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我必须获取第一个查询的结果,结果是11070
,并将其插入到下一个查询中,增加1
. 我宁愿有一个查询,一举完成所有这些。
“两次猛扑”的方法会是这样,如果它有效,但失败了:
ALTER SEQUENCE users_id_seq RESTART WITH (SELECT MAX(id) as highest_id FROM users);
ALTER SEQUENCE users_id_seq INCREMENT BY 1;
Run Code Online (Sandbox Code Playgroud)
如果我可以+ 1
在第一个ALTER SEQUENCE
语句中使用并跳过第二个语句,那就更好了。
有什么办法可以解决这个问题吗?(无论是两步还是一步,但无需我手动干预。)