testing - 使用 Buf 测试模块 'isa-ok'

标签 testing raku

使用 Perl6 Test 模块通过 Buf 测试对象的类型:

use Test;
isa-ok Buf.new, Buf;
isa-ok Buf.new, Blob;
isa-ok Buf.new, 'Buf';
isa-ok Buf.new, 'Blob';
ok Buf.new ~~ Buf;
ok Buf.new ~~ Blob;
does-ok Buf.new, Buf;
does-ok Buf.new, Blob;

这是输出:

not ok 1 - The object is-a 'Buf'
# Failed test 'The object is-a 'Buf''
# at buftest line 3
# Actual type: Buf
not ok 2 - The object is-a 'Blob'
# Failed test 'The object is-a 'Blob''
# at buftest line 5
# Actual type: Buf
ok 3 - The object is-a '"Buf"'
not ok 4 - The object is-a '"Blob"'
# Failed test 'The object is-a '"Blob"''
# at buftest line 9
# Actual type: Buf
ok 5 - 
ok 6 - 
ok 7 - The object does role 'Buf'
ok 8 - The object does role 'Blob'

isa-ok 是如何工作的?这与 ~~ 有何不同? 针对 Buf'Buf' 测试对象有什么区别? 为什么 Buf 不被视为 isa BufBlob? (虽然它一个'Buf'但仍然不是一个'Blob'

一般来说,isa-ok 是否理解角色,或者必须为他们使用 does-ok

最佳答案

参见 isa-ok does not work with parametrized types . (我认为问题标题具有误导性,因为 aiui 它实际上是关于类、未参数化的角色和未参数化的类型。毕竟可以编写 Array[Int],这可以说是参数化类型。)

我通过 searching the Rakudo Github repo for 'isa-ok' 找到了这个并点击问题

Mu.pm6定义 isa:

proto method isa(|) {*}

multi method isa(Mu \SELF: Mu $type --> Bool:D) {
    nqp::hllbool(SELF.^isa($type.WHAT))
}

multi method isa(Mu \SELF: Str:D $name --> Bool:D) {
    return True if .^name eq $name for SELF.^mro;
    False
}

第一个 multi 仅在类型为类时有效。在 P6 中,“isa”一词的技术含义是 A isa B 当且仅当 AB 都是 Ainheritance B

(更具体地说,执行Perl6::Metamodel::MROBasedTypeChecking 的类的isa 解析为相应角色 中的方法根据类的方法解析顺序检查匹配项。)

Buf 这样的类型是一个角色。 (角色可以很容易地“双关”到相应的匿名类/实例中,例如 Buf.new,但这并不能阻止 Buf 本身就是一个角色。)

Array 这样的类型是有效的,因为 Array 是一个类。

所以:

put Array.HOW.^name; # Perl6::Metamodel::ClassHOW+{<anon>}
say Array.^mro;      # ((Array) (List) (Cool) (Any) (Mu))
isa-ok Array, List;  # ok
put Buf.HOW.^name;   # Perl6::Metamodel::ParametricRoleGroupHOW
say Buf.^mro;        # No such method 'mro' for invocant of type
                     # 'Perl6::Metamodel::ParametricRoleGroupHOW'

isa-ok 的字符串版本仅在您传递类型名称的字符串版本时适用。不管是好是坏,它允许以一种草率的方式思考类型,并接受完全匹配。

~~是“智能匹配”。由右边的类型来决定左边的东西是否被认为是匹配的。

In general, does isa-ok understand roles or must does-ok be used for them?

不,它没有。您应该使用 does-ok

关于testing - 使用 Buf 测试模块 'isa-ok',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55196514/

相关文章:

testing - 我将如何以 BDD 风格在 Rhomobile 中测试 Controller ?

php - 如何在 Symfony2 功能测试中通过 HWIOAuth 模拟身份验证?

python - 在 pytest 中显示已通过测试的详尽信息

list - 如何获取由 Perl6 中的重复项组成的列表?

inheritance - 我怎样才能在 Perl 6 中重新启用一个对象?

sequence - 关于Raku中数组生成序列的问题

oop - 如果正则表达式是方法,它们对应于哪个类?

language-agnostic - 如何让测试不乏味?

arrays - 是否有与字节数组等效的Perl 6?

asp.net - 从用户的角度进行端到端应用程序测试