小编Chr*_*oom的帖子

为什么MiniTest :: Spec没有wont_raise断言?

Ruby Test::Unitassert_nothing_raised.Test::Unit已被MiniTest取代.为什么MiniTest的断言/期望与此没有任何平行?例如,你可以期待,must_raise但不是wont_raise.

ruby unit-testing minitest

32
推荐指数
2
解决办法
8765
查看次数

是否值得尝试为世界上最紧密耦合的网站编写测试?

想象一下,90%的工作仅仅是为了在一个非常庞大,非常破碎的网站上分类问题.想象一下,这个网站是用你所见过的最紧密耦合,最不具有凝聚力的PHP代码编写的,这种代码类型可以将原始开发人员添加到你的"一瞥"栏目中.想象一下,这个Web应用程序由4个非常不同的部分组成(1个商业,2个"重新定位",1个自定义)和一堆垃圾虚拟胶带和垫片.想象一下,它包含了一种编程实践,其中网站的主要组件实际上依赖于不正常工作的东西,修复这些破碎的东西通常会破坏其他东西.想象一下,你从太多糟糕的经历中知道改变一个看似无害的网站部分,比如拆分"名字" 字段分为两个单独的"第一"和"最后"字段,将使网站瘫痪,需要数小时的回滚,合并和补丁.想象一下,多年来恳求客户抛弃代码并重新开始,但遭遇企业级绝望和手工绞尽脑汁.然后想象获得ASAP/EMERGENCY门票以实现新功能,在任何其他网站上需要4个小时,但你对这个网站有更好的了解,所以你引用了40个小时,然后直接吹了80个小时,但它没关系,因为客户端用于他们的网站.想象一下,多年来恳求客户抛弃代码并重新开始,但遭遇企业级绝望和手工绞尽脑汁.然后想象获得ASAP/EMERGENCY门票以实现新功能,在任何其他网站上需要4个小时,但你对这个网站有更好的了解,所以你引用了40个小时,然后直接吹了80个小时,但它没关系,因为客户端用于他们的网站.想象一下,多年来恳求客户抛弃代码并重新开始,但遭遇企业级绝望和手工绞尽脑汁.然后想象获得ASAP/EMERGENCY门票以实现新功能,在任何其他网站上需要4个小时,但你对这个网站有更好的了解,所以你引用了40个小时,然后直接吹了80个小时,但它没关系,因为客户端用于他们的网站.

以下是您还应该想象的其他一些事情:

  • 现在没有任何测试
  • googleteen有不同的登录层.有些客户实际上有3个不同的帐户用于网站的不同部分
  • 当我说"紧耦合"时,我的意思是include/require语句的循环可能会像凯尔特结一样映射出来
  • 当我说"最不具凝聚力"时,我的意思是某些东西有点像MVC,但它不是真正的MVC.在某些情况下,您可能需要几个小时才能找到URI A如何映射到文件B.
  • 用户界面写得像"突兀","无法访问"是当时的流行语

想象一下,甚至值得尝试达到中等水平的测试覆盖率?或者,在这个想象的情景中,你应该继续尽你最大的努力,你已经给予了什么,并希望,祈祷,甚至牺牲,客户将同意重写其中一天,然后你就可以开始写作了测试?

附录

因为你们中的许多人提出了这个问题:我已经接触过每次机会重新写作的可能性.与我合作的营销人员知道他们的代码是垃圾,他们知道这是他们最初使用的"最低出价"公司的错.作为承包商,我可能已经超越了我的界限,指出他们花了我一大笔钱给我这个网站提供临终关怀服务,而且从头开始重新开发他们会很快看到投资回报率.我还说我拒绝按原样重写网站,因为它实际上并没有按照他们的意愿去做.计划是重写它的BDD风格,但让所有关键球员都在一个地方很难,我仍然不确定他们知道他们需要什么.无论如何,我完全希望这是一个非常大的项目.

感谢到目前为止的所有反馈!

php testing cohesion tightly-coupled-code

30
推荐指数
5
解决办法
903
查看次数

"仅在第二次和后续测试中找不到#<User ...>的有效映射"

我正在尝试编写一个请求测试,断言应用程序布局上显示正确的链接,具体取决于用户是登录还是退出.FWIW,我正在使用Devise进行身份验证.

这是我的规格:

require 'spec_helper'
require 'devise/test_helpers'

describe "Layout Links" do
  context "the home page" do
    context "session controls" do
      context "for an authenticated user" do
        before do
          # I know these should all operate in isolation, but I
          # want to make sure the user is explicitly logged out
          visit destroy_user_session_path

          @user = Factory(:user, :password => "Asd123", :password_confirmation => "Asd123")
          @user.confirm!

          # I tried adding this per the Devise wiki, but no change
          @request.env["devise.mapping"] = Devise.mappings[:user]

          # Now log a …
Run Code Online (Sandbox Code Playgroud)

integration-testing devise rspec2 factory-bot

28
推荐指数
3
解决办法
2万
查看次数

处理此问题的最佳方法是:在完全下载文件之前,通过PHP +大量下载来自客户端=脚本超时的慢速连接

我的客户想要一种向用户提供下载的方法,但只有在他们填写注册表(基本上是姓名和电子邮件)之后.通过可下载内容的链接向用户发送电子邮件.链接包含对包,文件和用户唯一的注册哈希,它们实际上转到记录每次下载的PHP页面,并通过将文件写入stdout(以及相应的头文件)将文件推出.此解决方案具有固有的缺陷,但这就是他们想要这样做的方式.需要说的是,我努力推动他们1.)限制可下载文件的大小和2.)考虑使用CDN(他们有国际客户,但托管在美国在2个镜像服务器和使用粘性IP的负载均衡器上.无论如何,它"适合我" 但他们的一些国际客户的连接速度很慢(d/l速率约为60kB /秒),其中一些文件相当大(150 MB).由于这是一个提供这些文件的PHP脚本,因此它受脚本超时设置的约束.起初我把它设置为300秒(5分钟),但这对于一些测试版用户来说还不够.所以我尝试根据文件大小除以100kb /秒连接计算脚本超时,但其中一些用户甚至比这慢.

现在客户端想要提升超时值.如果脚本以某种方式进入无限循环,我不想一起删除超时.我也不想为了一些全能最低公分母连接速率而任意推出超时(大多数人的下载速度比100kb /秒快得多).而且我也希望能够在某个时候告诉客户"看,这些文件太大而无法以这种方式处理.您正在通过这些40多分钟的连接影响网站其余部分的性能.我们要么需要重新考虑如何交付或使用更小的文件."

我有几个解决方案,如下:

  1. CDN - 将文件移动到CDN服务,如亚马逊或谷歌.我们仍然可以通过PHP文件记录下载尝试,但随后将浏览器重定向到真实文件.这样做的一个缺点是,一旦用户拥有URL(可以通过观察HTTP头部收集),用户可以绕过脚本并直接从CDN下载.这不错,但不是很理想.
  2. 展开服务器场 - 将服务器场从2个服务器场扩展到4个以上,并从负载平衡器中删除粘性IP规则.缺点:这些是Windows服务器,因此价格昂贵.他们没有理由不能成为Linux盒子,但是设置所有新盒子可能需要比客户端允许的时间更长的时间.
  3. 设置2个新服务器严格用于提供这些下载 - 基本上与#2相同的优点和缺点,除了我们至少可以隔离网络的其余部分(并微调新服务器)这个特定的过程.我们也很容易制作这些Linux盒子.
  4. 检测用户连接速率 - 我想到了一种方法,通过在下载登录页面上使用AJAX来检测用户的当前速度,以计​​算下载具有已知文件大小的静态文件所需的时间,然后将该信息发送到服务器并根据该信息计算超时.它并不理想,但它比估计连接速度太高或太低都要好.我不确定如何将速度信息返回到服务器,因为我们当前使用从服务器发送的重定向标头.

#1-3的机会将被拒绝或至少被推迟.4这是一个很好的方法来解决这个问题,还是有其他我没有考虑过的问题?

(随意挑战原始解决方案.)

php connection timeout tracking download

11
推荐指数
1
解决办法
3709
查看次数

有没有办法在jQuery中检测隐式和显式CSS高度值?

在jQuery中,无论是$('#foo').height()$('#foo').css('height')返回值,即使没有高属性是使用CSS明确设置.有没有办法检测元素是否没有明确的高度,即它只是根据其内容呈现?

这是我写的一个例子来演示:http://jsfiddle.net/Enn6p/2/

编辑

为了进一步澄清我的问题,$('#foo').css('min-height')$('#foo').css('max-height')已经正确地返回一个空字符串,如果他们没有明确设定.我正在寻找一种方法来确定是否height通过CSS设置显式值.

使用案例

我有一个脚本,试图使浮动元素具有相同的高度.它通过循环元素来查看哪一个是最高的,然后将该高度应用于所有元素.在某些情况下,这些元素已经具有明确的高度设置,但其他元素是隐式呈现的.

我现在想要添加撤消它的功能,并使一切恢复到原来的高度.为了做到这一点,我需要知道元素最初是否设置了高度,或者高度是否为"auto".一旦我能够做到这一点,我可以将原始值存储在元素的数据集合中,然后使用它来稍后恢复到原始高度.

html javascript css jquery

10
推荐指数
1
解决办法
937
查看次数

帮助在Rails 3中获取时间和时区

我知道那里有几十个类似的问题,更不用说关于Interwebs的一般文章,但我仍然很难理解Rails如何在内部与Time Zones一起工作.

我目前已config.time_zone = 'Eastern Time (US & Canada)'在我的应用程序文件中配置,因为这是我和其他项目管理员所在的位置.拥有该网站的公司位于加利福尼亚州,因此他们将在太平洋时间.该应用程序拥有全球受众,虽然我们还没有这样做,但我们最终将实现用户首选时区.

那么我目前的问题:

  1. 我知道Rails分别在存储和检索时会神奇地将日期时间列值转换为UTC和从UTC转换,但是查看给定日期时间属性的本地版本的正确方法是什么?

  2. 一个当将使用Time.nowTime.zone.nowTime.now.in_time_zoneDateTime.nowDateTime.now.in_time_zone

  3. 将给定的datetime属性与上面列出的方法或相对于当前配置的时区的某些其他特定时间进行比较的正确方法是什么?使用UTC?

  4. 我们会有一些时间敏感的东西,比如需要根据应用程序的时区在特定时间发布的文章,所以如何让应用程序在我们指定的时区进行比较而不是当前配置的(假设一个用户时区是否已实现?)

  5. (新问题)如果我改变,会发生什么config.time_zone,以UTC在以后的日子?我是否必须在数据库中重置所有时间,否则会影响旧时代?

comparison timezone datetime ruby-on-rails-3

8
推荐指数
1
解决办法
1037
查看次数

为什么我看到这两个几乎相同的Ruby正则表达式模式有不同的结果,为什么一个匹配我认为它不应该?

使用Ruby 1.9.2,我在IRB中有以下Ruby代码:

> r1 = /^(?=.*[\d])(?=.*[\W]).{8,20}$/i
> r2 = /^(?=.*\d)(?=.*\W).{8,20}$/i
> a = ["password", "1password", "password1", "pass1word", "password 1"]
> a.each {|p| puts "r1: #{r1.match(p) ? "+" : "-"} \"#{p}\"".ljust(25) + "r2: #{r2.match(p) ? "+" : "-"} \"#{p}\""}
Run Code Online (Sandbox Code Playgroud)

这导致以下输出:

r1: - "password"         r2: - "password"
r1: + "1password"        r2: - "1password"
r1: + "password1"        r2: - "password1"
r1: + "pass1word"        r2: - "pass1word"
r1: + "password 1"       r2: + "password 1"
Run Code Online (Sandbox Code Playgroud)

1.)为什么结果不同?

2.)为什么r1匹配字符串2,3和4?(?=.*[\W])前瞻不会导致它失败,因为这些例子中没有任何非单词字符吗?

ruby regex unicode character-class

6
推荐指数
1
解决办法
116
查看次数

如何在JAR文件中实现安全数据库连接?

我不是Java开发人员,但我的客户已经雇用了一个更新其网站上的一些JAR文件.在此之前,我们审核了现有代码并发现了许多安全漏洞.我们用于使文件更安全的解决方案之一是创建一个对数据库具有只读访问权限的新数据库用户,并且仅针对JAR文件需要操作的那些表.然后我发现他们将这些凭证与JAR文件一起存储在纯文本文件中,只是远离公众的教育猜测.最后,今天他们要求更宽松的数据库权限,但我不认为她理解她真的不应该为正确编写的JAR文件需要它们.

无论如何,我很确定这个开发人员如果把它咬在后面就不会知道安全漏洞.而且我对Java/JAR文件不够了解,不能正确地告诉她她该做什么,只关于infosec告诉她她该做什么.

那么在编写连接到远程MySQL数据库的分布式JAR文件时,典型的安全注意事项是什么?是否有加密连接详细信息(用户名和/或密码)的标准方法?IIRC,不是.jar文件只是美化ZIP档案,并且没有任何人可以解压缩文件并查看源代码中的连接细节?有没有办法加密jar文件内容?


更新:我收到了开发人员的以下说明.这听起来不错吗?

jar文件中的所有类都是加密的.我总是加密所有类文件,然后将它们存档在一个jar文件中.如果您打开任何[编辑] jar,您将只看到加密代码.因此,用户无法通过反编译来查看源代码.这些类确实使用jdbc连接到db,搜索eangine需要连接到DB才能运行sqls.这些sql是jar文件中的加密clase.

当我问你关于加密数据库密码时,我的意思是你在下面说的.我们将在java中编写加密/解密代码并使用它.来自此源代码的编译类将再次作为reoutine类加密过程的一部分进行加密.我们使用名为Retroguard的Java混淆工具来加密所有类.我们还在html页面中嵌入了一个密钥,以确保只有在[编辑]网站下载后才能使用该应用程序.如果用户将jar复制到他的本地计算机并尝试运行它,它将失败.

java database security passwords jar

5
推荐指数
1
解决办法
6373
查看次数

测试Postgresql数组字段是空还是空的正确方法是什么

我有一个用integer_array字段定义的表.它包含以下数据:

 id | black_list 
----+------------
  4 |            
  5 |            
  8 |            
 12 |            
  6 |            
  7 |            
 10 | {5}        
 13 | {5}        
  3 | {}         
  9 | {3}        
 11 | {}         
 14 | {}         
  1 | {}         
  2 | {}         
 15 | {}         
 16 | {}         
 17 | {}         
(17 rows)
Run Code Online (Sandbox Code Playgroud)

我需要编写一个查询来查看数组字段是否为空 - NULL或其他.问题是{}值不是null,也不是从ARRAY_LENGTH函数返回任何长度.http://www.postgresql.org/docs/8.4/static/functions-array.html中列出的其他数组函数似乎都不是我需要的.我发现我可以写ARRAY_LENGTH(0 || black_list)它让所有这些都返回1或更长的长度,但这似乎是一个讨厌的黑客.测试这个的正确方法是什么?

奖金问题:究竟{}代表什么?我一直无法编写将返回该值的select语句.ARRAY[]抛出错误,ARRAY[""]返回{""},ARRAY[NULL]返回{NULL}

arrays postgresql comparison null function

5
推荐指数
1
解决办法
4956
查看次数

如何使用application_helper_spec.rb中的特定URL测试请求对象?

我有一个在application_helper.rb中定义的方法,它根据当前请求返回一个规范的URL.如何模拟或以其他方式指定控制器的完整URL?

# spec/helpers/application_helper_spec.rb
describe "#canonical_url" do
  it "should return a path to an asset that includes the asset_host" do
    # Given: "http://www.foo.com:80/asdf.asdf?asdf=asdf"
    helper.canonical_url().should eq("http://www.foo.com/asdf.asdf")
  end
end

# app/helpers/application_helper.rb
def canonical_url
  "#{request.protocol}#{request.host}#{(request.port == 80) ? "" : request.port_string}#{request.path}"
end
Run Code Online (Sandbox Code Playgroud)

编辑:

最后,我想测试canonical_url()为一堆不同的URL返回正确的字符串,一些带有端口,一些带有w/o,一些带有查询字符串,一些带有路径等等.也许这太过分了,但这是最终目标.我想明确存根/模拟/无论初始URL,然后在匹配器中显式设置期望.我希望能够在一次通话中做到这一点,即controller.request.url = 'http://www.foo.com:80/asdf.asdf?asdf=asdf'或者request = ActionController::TestRequest.new :url => 'http://www.foo.com:80/asdf.asdf?asdf=asdf'到目前为止我还没有找到一个允许我这样做的"钩子".这就是我正在寻找的解决方案.如何显式定义给定测试的请求URL.

unit-testing ruby-on-rails helpers rspec2

3
推荐指数
1
解决办法
4875
查看次数

关闭不再配置的流浪盒

我最初创建了一个Vagrantfile配置默认框.后来,我更新了Vagrantfile使用命名框("db"),配置略有不同.不幸的是,在我配置新盒子之前,我忘了暂停初始盒子.现在有一个流氓流浪汉在后台运行,即使在重新启动主机后也无法停止.

$ vagrant global-status
id       name    provider   state    directory                                                                 
---------------------------------------------------------------------------------------------------------------
6b855b0  default virtualbox running  /Users/chrisbloom7/Projects/rails-upgrade 
d348c3b  db      virtualbox poweroff /Users/chrisbloom7/Projects/rails-upgrade 

$ vagrant halt -f 6b855b0
The machine with the name 'default' was not found configured for
this Vagrant environment.

$ cat Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.box = "ubuntu/trusty64"

  config.vm.define "db", primary: true do |db|
    db.vm.provider :virtualbox do |vb|
      vb.name = "rails-upgrade-development-mysql"
    end

    # ...
  end
end

$ git show HEAD^:Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.box = "box-cutter/ubuntu1004" …
Run Code Online (Sandbox Code Playgroud)

virtualbox vagrant vagrantfile

3
推荐指数
1
解决办法
4683
查看次数

无法在SQL Server镜像方案中设置见证错误

我有三个Windows服务器(data1,data2和datawitness)不属于任何域,不使用AD.我正在尝试根据http://alan328.com/SQL2005_Database_Mirroring_Tutorial.aspx上的说明设置镜像.我已经成功,直到最后一组指令,我告诉data1使用datawitness作为见证服务器.该步骤失败,并显示以下消息:

alter database MyDatabase set witness ='TCP://datawitness.somedomain.com:7024'

无法将ALTER DATABASE命令发送到远程服务器实例"TCP://datawitness.somedomain.com:7024".数据库镜像配置未更改.验证服务器是否已连接,然后重试.

我使用telnet测试了端口7024和1433,两个服务器确实可以相互连接.我还能够从主服务器上的SQL Server Manager添加到见证服务器的连接.我已经在两台服务器上使用配置管理器来启用命名管道并验证IP流量是否已启用并默认使用端口1433.

还有什么呢?我需要打开任何其他端口才能使用吗?(防火墙规则非常严格,但我知道前面提到的端口上的流量是明确允许的)

值得一提的注意事项:

  • 每个服务器都在不同的网段中

  • 服务器不使用AD,也不属于域

  • 没有为这些服务器配置DNS服务器,因此我使用HOSTS文件将域名映射到IP地址(使用telnet,ping等进行验证).

  • 防火墙规则非常严格,我无法直接调整它们,但我可以根据需要调用更改

  • Data1和Data2使用SQL Server 2008,Datawitness使用SQL Express 2005.所有这些都使用默认实例(即它们都不是命名实例)

certificate sql-server-2005-express mirroring sql-server-2008

2
推荐指数
1
解决办法
6895
查看次数