近期出错小记I

记录下近期遇到的一些问题以及所犯的低级错误,考虑每个单独写一篇内容太少,索性一锅炖。

Rspec 针对model 的attribute进行 stub

一个简单的测试例子:

有model Payment, 含字段channel,string 类型。

  it 'test' do
    allow_any_instance_of(Payment).to receive(:channel).and_return 'wxpay'
    a = Payment.new
    expect(a.channel).to eql 'wxpay'
  end

看着没什么问题,但是终端跑测试,报错:

Payment does not implement #channel

参考Rails Rspec allow_any_instance_of raises “does not implement” error for ActiveRecord object attributes

有两种解决方法:

  • allow_any_instance_of(Payment)改为 allow_any_instance_of(Payment.new.class) 【原因看这里Dynamic classes
  • 改用instance_double('Payment', channel: 'wxpay') , 替换掉allow_any_instance_of .....

修改测试代码【这里用instance_double】:

  it 'test' do
    instance_double('Payment', channel: 'wxpay')
    # 或者 allow_any_instance_of(Payment.new.class).to receive(:channel).and_return 'wxpay'
    a = Payment.new
    expect(a.channel).to eql 'wxpay'
  end

OK,passed.

PostgreSQL 中对array类型的attr查询

场景:

model product 中有一属性 categories,数据类型为array.

现有如下数据:

 product1.categories = ['aa', 'bb']
 product2.categories = ['cc']
 product3.categories = ['dd', 'aa'] 

给定字符串S, 比如 ‘aa’,如何查询出Product中所有类别包含’aa’的记录? [肉眼看出,是product1,product3]

product.rb中的添加一个scope:

  scope :categroy_cont, -> (categroy) { where("? = ANY(categories)", categroy)}

执行Product.all.category_cont('aa') 即可。

之前复制了一个Rails项目,终端执行:

bin/yarn xxxx

报错,显示 permission denied: bin/yarn

终端执行:

ls -al bin

bin下面有yarn文件,但是文件属性中没有可执行的权限,, 执行:

chmod +x bin/*

解决了。

当时只知道copy 文件的时候,文件的权限遗失,但是不知道为什么会出现这种情况。

后面偶然发现了原因,手贱啊,原来是自己当时手动复制了整个文件夹,然后重命名了复制的那个文件夹,结果导致新项目中的link和可执行权限全部丢失了。

正确的复制方式,保留link 和权限:

cp -a fold1 fold2

这样复制后,得到的fold2下,所有的权限和link都不会丢失。

git 文件名大小写

记录下这个,纯粹是因为在大小写这个问题上踩的坑有些过分了。

直接使用命令:

git mv oldfileName newfileName

比如文件名为Hello.rb, 修改为hello.rb:

git mv Hello.rb hello.rb

或者稍微麻烦一点:

先将文件重命名为Hello1.rb,提交,commit,然后再重命名为hello.rb,再提交,最后将两个commit合并 rebase成一个commit。

参考

Dynamic method verification fails when method stubbed using allow_any_instance_of on a class not previously instantiated

Dynamic classes

Rails Rspec allow_any_instance_of raises “does not implement” error for ActiveRecord object attributes

Rails + Postgres Array + ANY LIKE