【问题标题】:Trouble in mocking a database and stub :save模拟数据库和存根时遇到问题:save
【发布时间】:2014-04-18 04:37:25
【问题描述】:

首先我是模拟/存根的新手,我在模拟/存根时遇到了麻烦

这是我的应用程序代码:

describe 'Register an User' do
    VALID_USERNAME = "..."
    VALID_PASSWORD =  "..."
    VALID_USER = User.new(VALID_USERNAME, VALID_PASSWORD)

    before (:each) do
        User.any_instance.stub(:save).and_return(true)
    end

    it 'should create a new user' do
        post :create, :username => VALID_USERNAME, :password => VALID_PASSWORD
        expect(response.status).to eq(201)
        #user_inserted = ...
        #expect(user_inserted).to eq(VALID_USER)
    end
end

还有:

def create
        username = params[:username]
        password = params[:password]
        if not username or not password
            render :json => '', :status => 400
        else
            success = User.new(username, password).save
            if success
                render :json => '', :status => 201
            else
                render :json => '', :status => 500
            end
        end
    end

我正在尝试模拟 ActiveRecord,以测试“创建”,而无需测试“获取”。 这里的想法是当我调用“user.save”时可以在不使用数据库的情况下保存用户,然后我会在我的测试用例中访问,所以我保证用户被“插入”到我的数据库中。

如果我运行测试,它会通过,但我不会验证我愿意做什么。有什么帮助或想法吗?

谢谢!

【问题讨论】:

  • 什么是User.new(VALID_USERNAME, VALID_PASSWORD)new 方法是您的自定义方法吗?如果是,它会返回什么?注意来自 ActiveRecord 的new 接受哈希

标签: ruby-on-rails rspec mocking


【解决方案1】:

这是没有意义的,因为如果不插入数据库就无法测试数据库中的插入。为什么?

Rails 带有内置验证,这是保存项目的第一步。如果验证通过,则通过 ActiveRecord 将项目插入数据库中。数据库验证从这一步开始,如果有任何失败,它们会引发异常。

所以。如果您想测试是否可以在数据库中创建用户,请将验证添加到与数据库匹配的模型中。然后就可以使用is_valid?这个方法了。

这将确保您的用户有效地存储在数据库中。因此,您可以在任何地方使用它,因为您知道:user_instance.is_valid? 定义了一个可插入项。

我希望这是你问的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-24
    相关资源
    最近更新 更多