小编Bra*_*ice的帖子

FactoryGirl工厂用于命名空间类

任何证明或反驳我的想法的文件链接都将非常感激; 我似乎找不到任何东西.

AFAIK,如果您有一个带Product模型的Rails应用程序,您可以将FactoryGirl工厂定义为

FactoryGirl.define do
  factory :product do
    # stuffs
  end
end
Run Code Online (Sandbox Code Playgroud)

然后在测试中调用工厂(RSpec示例)

let(:product) { FactoryGirl.create(:product) }
Run Code Online (Sandbox Code Playgroud)

但你也可以用它来打电话

let(:product) { FactoryGirl.create(Product) }
Run Code Online (Sandbox Code Playgroud)

如果您希望保持模型测试更加动态并且可以使用RSpec的described_class帮助程序自由更改,这将非常有用.

我的问题:

我有一个恰好是命名空间的模型

class Namespace::MyModel < ActiveRecord::Base
  # model stuffs
end
Run Code Online (Sandbox Code Playgroud)

与工厂

FactoryGirl.define do
  factory :my_model, class: Namespace::MyModel do
    # factory stuffs
  end
end
Run Code Online (Sandbox Code Playgroud)

当试图使用RSpec的助手时......

RSpec.describe Namespace::MyModel do
  let(:my_object) { FactoryGirl.create(described_class) }
  # testing stuffs
end
Run Code Online (Sandbox Code Playgroud)

FactoryGirl抱怨工厂丢失

Factory not registered: Namespace::MyModel
Run Code Online (Sandbox Code Playgroud)

我是否错过了FactoryGirl的这个功能,却没有理解它的真正目的?或者是否有另一种方法可以定义我的工厂以正确解析?

ruby rspec ruby-on-rails factory-bot

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

Stub ActiveRecord ::与ActiveRecord对象的关系

我没有测试Rails应用程序.只是把它排除在外.

我正在测试一个连接到相对活跃的服务器的库,通过时间戳限制记录.这些返回的记录随着时间​​的推移而变化,使得测试其他限制更加复杂.我需要将该ActiveRecord::where方法与我创建的对象一起返回我自己的自定义关系,以满足我需要的标准.

就像是

relation = double(ActiveRecord::Relation)
relation.stub(:[]).and_return( [MyClass.new(...), MyClass.new(...), ...] )
MyClass.stub(:where).and_return( relation )
Run Code Online (Sandbox Code Playgroud)

是我想要的,但这不起作用.我需要它是ActiveRecord::Relation因为我需要能够调用ActiveRecord::where,并ActiveRecord::select在代码中的对象.


编辑2014-01-28

在lib/call.rb中

class Call < ActiveRecord::Base
  class << self
    def sales start_time, end_time
      restricted_records = records(start_time, end_time, :agent_id)
      #other code
    end

    #other methods

    private

      def records start_time, end_time, *select
        # I'm leaving in commented code so you can see why I want the ActiveRecord::Relation object, not an Array
        calls = Call.where("ts BETWEEN '#{start_time}' AND '#{end_time}'") #.select(select)
        raise …
Run Code Online (Sandbox Code Playgroud)

ruby activerecord rspec mocking relation

7
推荐指数
1
解决办法
1万
查看次数

你可以在创建后更改Python Canvas对象的属性吗?

我正在尝试模拟一个美国交通信号灯,在一个矩形上有3个圆圈,所有这些都是在一套Canvas上绘制的.模拟应该通过按以下顺序每2秒更改显示哪个灯来反映"动画":绿色>黄色>红色>绿色等永远.

我能想到的唯一方法是使用canvas.move(),canvas.after(),canvas.update()模式移动填充的椭圆形对象,一次叠加一个未填充的圆.我已经得到了逻辑,以适当的速度和正确的顺序移动一个圆圈.问题是,我只是实例化了一个充满"绿色"的圆圈,但我无法使用此方法将其更改为"黄色"或"红色".看看canvas.delete("填充")似乎很愚蠢,并且每隔2秒在一个新的地方重新绘制一个不同的填充,因为这对于这样一个简单的程序来说有很多工作要做.

问题1:有没有办法可以随意改变fill我填充的Canvas对象的选项,使用某种方法或其他方法?

问题2:我是否错误地接近了这种情况?有没有更好的方法来模拟这个?

python tkinter tkinter-canvas

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

在Sublime Text 2中使用默认的ruby版本

我的默认和当前版本的ruby是1.9.3.它实际上是我运行时出现的唯一版本,rvm list所以我看不出我是如何弄乱那部分的.我确实按照 我在这里找到的这个教程,但它似乎打破了一切.对于我看到的修复程序的所有变体,我一直得到"没有这样的文件或目录",甚至在评论中也是如此.我在Mac上,请让我知道我需要在这里发布的其他信息,以帮助你弄清楚我是如何破坏的.

macos ruby-1.9.3 sublimetext2

4
推荐指数
1
解决办法
3977
查看次数

在测试控制器时与rspec分配混合

我正试图掌握测试控制器的问题,到目前为止,我似乎仍然坚持最简单的问题.

documents.controller:

    def edit
      @document = Document.find(params[:id])
    end
Run Code Online (Sandbox Code Playgroud)

documents_controller_spec:

    describe 'GET #edit', focus: true do
      before(:each) { @doc = FactoryGirl.create(:document)}

      it "should assign @document to the document" do
        get :edit, id: @doc
        assigns(:document).should eq(@doc)
      end
    end
Run Code Online (Sandbox Code Playgroud)

始终返回false.@document总是分配为nil.我已经尝试将params [id]指定为@ doc.id,但这并没有解决任何问题.我在这做错了什么?

controller rspec ruby-on-rails assign

4
推荐指数
1
解决办法
2438
查看次数

词典理解中的三元表达

我正在尝试倒转字典。在许多键具有相同值的情况下,新键(旧值)应与一组新值(旧键)相关联。我解决了问题,但是我尝试使用字典理解和一些辅助方法进行重构。

def has_unique_value(k):
    return d.values().count(d[k]) == 1

def keys_with_same_value_as_key(k):
    return set([key for key in d.keys() if d[key] == d[k]])

print( {d[k]:k if has_unique_value(k) else d[k]:keys_with_same_value_as_key(k) for k in d.keys()} )
Run Code Online (Sandbox Code Playgroud)

但是,这会引发语法错误

print( {d[k]:k if has_unique_value(k) else d[k]:keys_with_same_value_as_key(k) for k in d} )
                                               ^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

希望该代码中的对齐正确。它应指向第二:,中else条款。知道这里有什么吗?我尝试了尽可能多的括号形式。

python dictionary list-comprehension dictionary-comprehension

4
推荐指数
2
解决办法
1194
查看次数

编写无效的FactoryGirl工厂/特征是一个坏主意吗?

听巨型机器人粉碎到其他巨型机器人播客,我听说你希望你的FactoryGirl工厂最小化,只提供那些使对象在数据库中有效的属性.话虽这么说,谈话还继续说,特征是一种非常好的方法,可以根据可能在未来发生变化的属性来定义特定行为.

我想知道是否有一个好主意是定义了故意无法通过验证来清理规范代码的特征.这是一个例子:

factory :winner do
  user_extension "7036"
  contest_rank 1
  contest

  trait :paid do
    paid true
  end 

  trait :unpaid do
    paid false
  end 

  trait :missing_user_extension do
    user_extension nil 
  end 

  trait :empty_user_extension do
    user_extension ""
  end 

end
Run Code Online (Sandbox Code Playgroud)

将允许我build_stubbed(:winner, :missing_user_extension)在测试中调用我的规范我打算验证失败.我想我可以通过将这些坏工厂嵌套在另一家工厂下来进一步明确失败:invalid_winner,但我不太确定是否有必要.我最感兴趣的是听取别人对这个概念的看法.

unit-testing ruby-on-rails traits rspec2 factory-bot

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

C++标题重新定义/声明混合

我试图从一个简单的程序中抽象出一个方法.此方法针对预先声明的CAPACITY常量测试数组的长度,并在不满足条件时发出错误消息.但是,我在创建带有.cpp文件的头文件时无法保存该方法.

头文件:

    //arrayHelper.h
    #ifndef ARRAYHELPER_H
    #define ARRAYHELPER_H

    void arrayLengthCheck(int & length, const int capacity, string prompt);

    #endif // ARRAYHELPER_H
Run Code Online (Sandbox Code Playgroud)

代码文件:

    //arrayHelper.cpp
    #include <iostream>
    #include <string>
    #include "arrayHelper.h"

    using namespace std;

    void arrayLengthCheck(int & length, const int capacity, string prompt)
    {
        // If given length for array is larger than specified capacity...
        while (length > capacity)
        {
            // ...clear the input buffer of errors...
            cin.clear();
            // ...ignore all inputs in the buffer up to the next newline char...
            cin.ignore(INT_MAX, '\n');
            // …
Run Code Online (Sandbox Code Playgroud)

c++ include header-files

0
推荐指数
1
解决办法
144
查看次数

概念化集合理解

def nfa_eclosure(M, s):
    """
    >>> M = [{'':{1,2,3}}, {'b':{1}}, {'a':{2}}]
    >>> nfa_eclosure(M, 0)
    set([0, 1, 2, 3])
    """
    try:
        states = {nfa_eclosure(M, x+1) for x in xrange(len(M[s])) if M[s].get('')}
    except IndexError:
        states = set([])
    states.add(s)
    return states
Run Code Online (Sandbox Code Playgroud)

运行此抛出,TypeError: unhashable type: 'set'但我看不到问题。


编辑:2014-02-03 15:25:00

谢谢大家的解释。那讲得通。有没有一种“ pythonic”的方式来获取我现在拥有的代码,然后将集合的内容“ splat”到新的集合中,而不是将所有内容都转换为frozenset,然后将其展平?


编辑:2014-02-04 00:41:00

我做了一些修改,现在我想到了:

try:
    return set([s]).union(*(nfa_eclosure(M, x) for x in M[s].get('')))
except IndexError:
    return set([s])
Run Code Online (Sandbox Code Playgroud)

但我有新的错误信息

TypeError: union() argument after * must be a sequence, not generator
Run Code Online (Sandbox Code Playgroud)

谷歌搜索并不能很好地解释这种情况。知道发生了什么事吗?

python dictionary set set-comprehension

0
推荐指数
1
解决办法
287
查看次数

重载:+ =在Ruby中

我想在我的Ruby类上定义一个自定义:+ =方法来修改实例.但是,以下代码提出syntax error, unexpected '=', expecting ';' or '\n'

def +=(other)
  @value += other.to_f
end
Run Code Online (Sandbox Code Playgroud)

我有什么选择?我看到Fixnum有:+@和:-@方法,但我完全不看他们的文档中做什么.这些是我想写的方法吗?

ruby operator-overloading

0
推荐指数
1
解决办法
52
查看次数