assert_equal使用I18n.translate时的问题

今天重新在depot运行测试,用静态测试数据测试商品标题的唯一性,发现有个断言过不去:

 

assert_equal I18n.translate('activerecord.errors.messages.taken'), product.errors[:title]

错误信息:

 

 

  1) Failure:
test_product_is_not_valid_without_a_unique_title_-_i18n(ProductTest) [E:/works/rubyaptana/rails/test/unit/product_test.rb:67]:
<"has already been taken"> expected but was
<["has already been taken"]>.

5 tests, 24 assertions, 1 failures, 0 errors, 0 skips

 

 

后面发现在是因为没有照Agile Web Development with Rails Fourth Edition书上说的写。product.errors[:title]后还有join("; ")

看日志应该是一个字符串,和一个只有一个字符串元素的数组的区别。

经乱试,发现两种方式都可以通过:

1.

 

assert_equal I18n.translate('activerecord.errors.messages.taken'), product.errors[:title].join("")

 2.

assert_equal I18n.translate(['activerecord.errors.messages.taken']), product.errors[:title]

 

product_test.rb的测试方法是这样的:

  test "product is not valid without a unique title - i18n" do
    product = Product.new(title:       products(:ruby).title,
                          description: "yyy", 
                          price:       1, 
                          image_url:   "fred.gif")

    assert product.invalid?
    assert_equal I18n.translate(['activerecord.errors.messages.taken']), product.errors[:title]
    #assert_equal I18n.translate('activerecord.errors.messages.taken'), product.errors[:title].join("")
   end

 

 

### `.assert_equal("body.success", True)` 的使用 `.assert_equal("body.success", True)` 通常用于在测试框架中对 HTTP 响应的 JSON 数据进行断言,检查响应体中 `success` 字段的值是否为 `True`。 以下是一个结合之前 `HttpRequest` 类的示例,展示其使用方法: ```python import requests class MethodEnum: POST = 'POST' class Request: def __init__(self, url, method, json=None, headers=None): self.url = url self.method = method self.json = json self.headers = headers class HttpRequest: def __init__(self, name, request): self.name = name self.request = request self.assertions = [] def add_variable(self, name, value): self.request.url = self.request.url.replace(f"${name}", value) return self def assert_equal(self, key, value): self.assertions.append((key, value)) return self def do_request(self): response = requests.request(self.request.method, self.request.url, json=self.request.json, headers=self.request.headers) for key, expected_value in self.assertions: if key == "status_code": actual_value = response.status_code elif key.startswith("body."): field = key.split(".", 1)[1] actual_value = response.json().get(field) if actual_value != expected_value: raise AssertionError(f"Assertion failed: expected {expected_value} but got {actual_value} for {key}") return response # 使用示例 baseUrl = "https://example.com" json = {"key": "value"} headers = {"Content-Type": "application/json"} request = HttpRequest(name="xx", request=Request(url="$baseUrl/gcoll/d/outService/getCustomerInfoByCustIdOrIdent", method=MethodEnum.POST, json=json, headers=headers)) \ .add_variable("baseUrl", baseUrl) \ .assert_equal("body.success", True) \ .do_request() ``` 在上述代码中,`.assert_equal("body.success", True)` 会在 `do_request` 方法执行,从响应的 JSON 数据中提取 `success` 字段的值,并与 `True` 进行比较。如果不相等,会抛出 `AssertionError` 异常。 ### 可能出现的报错及解决方法 1. **`KeyError` 或 `AttributeError`**:当响应不是有效的 JSON 数据,或者 JSON 数据中不存在 `success` 字段,会抛出这些异常。解决方法是在进行断言之前,先检查响应是否为有效的 JSON 数据,并且确保字段存在。可以在 `do_request` 方法中添加相应的检查逻辑: ```python def do_request(self): response = requests.request(self.request.method, self.request.url, json=self.request.json, headers=self.request.headers) for key, expected_value in self.assertions: if key == "status_code": actual_value = response.status_code elif key.startswith("body."): field = key.split(".", 1)[1] try: actual_value = response.json().get(field) except ValueError: raise AssertionError(f"Response is not valid JSON: {response.text}") if actual_value is None: raise AssertionError(f"Field {field} not found in response JSON") if actual_value != expected_value: raise AssertionError(f"Assertion failed: expected {expected_value} but got {actual_value} for {key}") return response ``` 2. **`AssertionError`**:当 `body.success` 的值不等于 `True` ,会抛出该异常。这通常表示接口返回的数据不符合预期,需要检查接口的实现逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值