使用单元测试框架,
var car: IVehicle = Vehicle.getInstance("mycar") //dictionary
XCTAssertNotNil(car, "Expecting instance not null")
没有工作,不知道为什么(导致“IVehicle 不符合 AnyObject 协议(protocol)”编译器错误)。
但是 car as Car 起作用了:
XCTAssertNotNil(car as Car, "Expecting instance not null")
这没有用说测试总是正确的,不确定我们如何测试协议(protocol)的一致性?
XCTAssertTrue(car is IVehicle, "Expecting instance implements IVehicle")
最佳答案
首先,
XCTAssertNotNil(car, "Expecting instance not null")
假设 IVehicle 是一个协议(protocol),你会得到的错误是因为这意味着它不是 XCTAssertNotNil 要求的 AnyObject作为第一个参数(AnyObject 只能代表类,不能代表结构或协议(protocol))。这可能有点令人沮丧,因为 XCTAssertNotNil 建议它用于测试可选值是否设置为 nil,但你已经知道了。
下一步:
XCTAssertNotNil(car as Car, "Expecting instance not null")
这可以编译,但它可能没有“工作”...如果 car 永远不是 Car,您将得到运行时异常而不是断言失败。这是因为 car as Car 强制编译器将左边的表达式视为右边的类型,无论它是否是(假设它至少在某些情况下是有效的转换——如果这根本不可能,你会得到一个编译器错误)。如果在运行时它不是有效的转换,您将遇到运行时失败。
如果您不确定,将 car 安全地转换为 Car 的方法是使用 as?。所以这应该会给你你想要的结果:
XCTAssertNotNil(car as? Car, "Expecting instance not null")
这将导致 Some(car) 如果确实是 Car,或者 nil 如果不是,正确触发测试断言。
或者你可以这样写:
XCTAssert(car is Car, "Expecting car to be a Car")
最后,
car is IVehicle
始终为真,因为编译器在编译时知道 car 变量的类型,并且完全知道它是一个 IVehicle — 这就是它的类型。所以它假设你是无意中写的,因为它永远不可能是假的,而且它会告诉你。
关于swift - 测试对象是否实现协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27489107/
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。
我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife