zoukankan      html  css  js  c++  java
  • Ruby on rails开发从头来(windows)(二十)测试model(CRUD)

     

    上篇随笔简单了解了rails的测试和测试用数据的使用,这次来看看怎样对一个model进行添删查改的测试。

     

    1.       还是使用上次写的products_test.rb,修改test_turth方法的名字为test_create,并且使其内容为:

      def test_create

        assert_kind_of Product, @product

        assert_equal 1, @product.id

        assert_equal "Pragmatic Version Control", @product.title

        assert_equal "How to use version control", @product.description

        assert_equal "http://.../sk_svn_small.jpg", @product.image_url

        assert_equal 29.95,@product.price

        assert_equal "2005-01-26 00:00:00",

        @product.date_available_before_type_cast

      end

    然后运行测试命令:depot>ruby test/unit/product_test.rb,屏幕上会显示信息:

    Loaded suite test/unit/product_test

    Started

    F

    Finished in 0.109 seconds.

     

      1) Failure:

    test_create(ProductTest) [test/unit/product_test.rb:16]:

    <29> expected but was

    <#<BigDecimal:4aad7b0,'0.2995E2',8(8)>>.

     

    1 tests, 6 assertions, 1 failures, 0 errors

     

    我们看到,是assert_equal 29.95,@product.price断言失败了。根据《Agile Web Development with Rails》里的内容,这句断言应该是正常通过的。但是不知道是不是版本或环境的问题,我自己写的时候总是不行。为了能够使断言通过,我们修改一下,把

    assert_equal 29.95,@product.price

    改为:assert_equal "29.95",@product.price_before_type_cast

    我们看到了,product对象的每个属性都有对应的_before_type_cast版本,其内容是一个字符串。

    现在再次运行测试命令,得到的结果如下:

    Loaded suite test/unit/product_test

    Started

    .

    Finished in 0.078 seconds.

     

    1 tests, 7 assertions, 0 failures, 0 errors

    从上面的测试中看到,我们在setup方法中,从数据库中查找了id1的记录,然后在test_create方法中对其的属性逐个判断测试。

     

    2.       对创建和读取的测试完成了,我们来进行对Update的测试,添加方法test_update,在这个方法里我们要对price字段进行更新,并通过断言判断是否成功更新:

      def test_update

        assert_equal "29.95", @product.price_before_type_cast

        @product.price = 99.99

        assert @product.save, @product.errors.full_messages.join("; ")

        @product.reload

        assert_equal "99.99", @product.price_before_type_cast

      end

    基于上面的test_create方法中对price测试的时候出现的问题,这里我们在断言里还是使用pricebefore_type_cast版本。

    再次运行测试命令,屏幕上的输出如下:

    Loaded suite test/unit/product_test

    Started

    ..

    Finished in 0.078 seconds.

     

    2 tests, 10 assertions, 0 failures, 0 errors

    证明所有的断言都成功了,现在到数据库里看看,id1productprice字段已经更新为99.99了。

    3.       最后我们来测试删除,添加test_destroy方法,内容如下:

    def test_destroy

        @product.destroy

        assert_raise(ActiveRecord::RecordNotFound) { Product.find(@product.id) }

      end

    运行测试命令,屏幕上输出如下:

    Loaded suite test/unit/product_test

    Started

    ..E

    Finished in 0.078 seconds.

     

      1) Error:

    test_update(ProductTest):

    ActiveRecord::RecordNotFound: Couldn't find Product with ID=1

    ……

    3 tests, 8 assertions, 0 failures, 1 errors

    上面的测试里,先删除掉id1的记录,然后使用断言,如果失败,就抛出一个ActiveRecord::RecordNotFound的错误。

    写到这里,从上面的信息里显示是test_update方法中显示了异常信息,按照直觉,应该是test_destroy方法才对,这个问题现在自己也还没有搞明白,还请rails高人指点。
  • 相关阅读:
    函数高阶(函数,改变函数this指向,高阶函数,闭包,递归)
    案例:新增数组方法
    案例:商品查询
    案例:forEach和some区别
    ES5新增方法(数组,字符串,对象)
    案例:借用父构造函数继承属性和方法
    构造函数 和 原型
    汽车小常识别让六大汽车驾驶软肋阻碍你
    Opencv 图像增强和亮度调整<6>
    C# StringBulider用法<1>
  • 原文地址:https://www.cnblogs.com/dahuzizyd/p/rails_ruby_windows_dotnet_study_20.html
Copyright © 2011-2022 走看看