这让我很困惑,我似乎无法找到这个问题的答案.清晰简单的说明会很好.
我试图找出如何使它成为一个OpenStruct的子类(或任何类的东西)或哈希,如果我尝试访问尚未设置的属性将引发自定义异常.我无法得到define_method和method_missing做到这一点,所以我无能应该如何在Ruby中进行.
这是一个例子:
class Request < OpenStruct...
request = Request.new
begin
request.non_existent_attr
rescue CustomError...
Run Code Online (Sandbox Code Playgroud)
我可以想象它必须是这样的:
class Hash
# if trying to access key:
# 1) key exists, return key
# 2) key doesn't exist, raise exception
end
Run Code Online (Sandbox Code Playgroud)
编辑:存在的属性不应引发异常.我正在寻找的功能是,我可以自由访问属性,如果它不存在我的自定义异常将被引发.
我正在尝试创建一个模拟来满足使用此代码的类型提示(Mockery):
return \Mockery::mock('\Contracts\Helpers\iFileSystemWrapper');
Run Code Online (Sandbox Code Playgroud)
或者这个(PHPUnit):
return $this->getMock('\Contracts\Helpers\iFileSystemWrapper');
Run Code Online (Sandbox Code Playgroud)
但返回的模拟称为Mockery\Mock Object或Mock_iFileSystemWrapper_a5f91049.当它不是我需要的任何一个框架的实例时,我该如何键入检查?
为什么模拟框架试图加载真正的类?如果我想要真正的课程,我会包括真正的课程.
这个问题在编写测试时已经减慢了很多次,我只是抛出类型暗示窗口并检查类名,或者只是使用生产对象,因为模拟很难使用.
我见过这样的代码:
def some_method
# ...
end.another_method
Run Code Online (Sandbox Code Playgroud)
这end.another_method部分做什么?
我有一个使用方法链接的验证类.我希望能够TRUE/FALSE像这样进行单一检查:
if ($obj->checkSomething()) {}
Run Code Online (Sandbox Code Playgroud)
但也像这样的链方法:
if ($obj->checkSomething()->checkSomethingElse()) {}
Run Code Online (Sandbox Code Playgroud)
但问题是,如果一个方法返回FALSE,它将不会发送回一个对象,从而打破以此错误结束的方法链:
Fatal error: Call to a member function checkSomething() on a non-object in ...
Run Code Online (Sandbox Code Playgroud)
我是否必须选择单个方法返回调用或方法链接,还是有解决方法?
我写了这个简单的代码来获取一个double并且只是一直询问,直到给出一个,但是当你给一个字符串它只是变成一个无限循环而我无法弄清楚为什么.它出现这种情况的原因是什么?
Scanner scanner = new Scanner(System.in);
double x = 0.0d;
while (true) {
try {
System.out.println("Gimme a double:");
x = scanner.nextDouble();
break;
} catch (InputMismatchException e) {}
}
System.out.println(x);
Run Code Online (Sandbox Code Playgroud) php ×3
ruby ×2
closures ×1
java ×1
mockery ×1
mocking ×1
openstruct ×1
phpunit ×1
return-value ×1
syntax ×1
unit-testing ×1
validation ×1
while-loop ×1