为私有方法编写测试是一种好习惯吗?
考虑以下简单示例:
class Group
has_many :members
private
def release_members
members.each { |member| member.update_attributes group_id: nil }
end
end
Run Code Online (Sandbox Code Playgroud)
在RSpec中为release_members方法编写测试是不错的做法?我相信你必须用send发出调用方法的测试.group.send(:release_members)这有时令人不悦.
默认情况下,类的成员在c ++中是私有的.
因此,我想知道是否有任何可能的用法来创建一个将其所有成员(变量和函数)默认设置为private的类.
换句话说,没有任何关键字是否存在任何有意义的类定义public,protected或者private?
来自C风格语法的悠久历史,现在正在尝试学习Ruby(在Rails上),我一直在用它的成语等问题分享我的问题,但今天我遇到了一个我没想到会出现问题的问题.我无法看到任何必须在我面前的东西.
我有一个二进制类,其中包含一个私有方法,用于从路径值派生URI值(uri和路径是类的属性).我打电话self.get_uri_from_path()从内部Binary.upload(),但我得到:
Attempt to call private method
Run Code Online (Sandbox Code Playgroud)
该模型的片段如下所示:
class Binary < ActiveRecord::Base
has_one :image
def upload( uploaded_file, save = false )
save_as = File.join( self.get_bin_root(), '_tmp', uploaded_file.original_path )
# write the file to a temporary directory
# set a few object properties
self.path = save_as.sub( Rails.root.to_s + '/', '' )
self.uri = self.get_uri_from_path()
end
private
def get_uri_from_path
return self.path.sub( 'public', '' )
end
end
Run Code Online (Sandbox Code Playgroud)
我打电话不正确吗?我错过了一些更基本的东西吗?目前唯一Binary.get_uri_from_path()被调用的地方是 - Binary.upload().我希望能够在同一个类中调用私有方法,除非Ruby做了与我使用的其他语言明显不同的东西.
谢谢.
先期:我很清楚,R是一个功能性的语言,所以请不要咬;-)
我在很多程序中使用OOP方法都有很棒的经验.现在,我想知道在R中使用S4参考类时是否有办法区分公共方法和私有方法?
setRefClass("B",
field=list(
b.1="numeric",
b.2="logical"
),
methods=list(
thisIsPublic=function(...) {
thisIsPublic_ref(.self=.self, ...)
},
thisIsPrivate=function(...) {
thisIsPrivate_ref(.self=.self, ...)
}
)
)
setRefClass("A",
field=list(
a.1="B"
)
)
Run Code Online (Sandbox Code Playgroud)
注意
我通常不会将实际的方法定义放在类def中,而是将其分离为S4方法(即thisIsPublic_ref),原因如下:
x某个类的实例,您可以调用foo_ref(.self=x)而不是x$foo().compiler::cmpfun()如果你有"普通"的引用类方法,它允许你对我认为不可能的方法进行字节编译.对于这个具体的例子来说,确实没那么复杂是有道理的,但我想我会说明这种方法.
setGeneric(
name="thisIsPublic_ref",
signature=c(".self"),
def=function(
.self,
...
) {
standardGeneric("thisIsPublic_ref")
}
)
setGeneric(
name="thisIsPrivate_ref",
signature=c(".self"),
def=function(
.self,
...
) {
standardGeneric("thisIsPrivate_ref")
} …Run Code Online (Sandbox Code Playgroud) 什么时候我应该做一个功能private,为什么这是个好主意?
C#编译器给了我以下错误
CS0191:无法分配只读字段(构造函数或变量初始化程序除外)
我是否必须将代码(在我的私有函数中)移动到构造函数中?这听起来很尴尬.
请注意,私有方法仅供构造函数调用.我希望有一些属性可以用来标记相应的方法.
我正在尝试单元测试私有方法.我在这个问题上看到了下面的例子
Class target = new Class();
PrivateObject obj = new PrivateObject(target);
var retVal = obj.Invoke("PrivateMethod");
Assert.AreEqual(retVal);
Run Code Online (Sandbox Code Playgroud)
我的私人方法有2个参考参数.如何通过?
在C++和Java,数据结构可以具有private,public和protected区域.我想将这个概念移植到我正在编写的C语言程序中.
是否有任何习惯用于在C中实现私有或受保护的函数指针和数据字段struct?
我知道C struct是公开的,我正在寻找一个成语来帮助隐藏一些实现细节并迫使用户使用公共接口.
注意:该商店已选择该语言,因此我无法将面向对象的概念应用到C.
谢谢.
我使用JMockit 1.1,我想做的就是调用私有方法并测试返回值.但是,我无法从JMockit De-Encapsulation示例中了解如何执行此操作.
我试图测试的方法是这个类中的私有方法:
public class StringToTransaction {
private List<String> parseTransactionString(final String input) {
// .. processing
return resultList;
}
}
Run Code Online (Sandbox Code Playgroud)
我的测试代码如下.
@Test
public void testParsingForCommas() {
final StringToTransaction tested = new StringToTransaction();
final List<String> expected = new ArrayList<String>();
// Add expected strings list here..
new Expectations() {
{
invoke(tested, "parseTransactionString", "blah blah");
returns(expected);
}
};
}
Run Code Online (Sandbox Code Playgroud)
而我得到的错误是:
java.lang.IllegalStateException:此时缺少对mocked类型的调用; 请确保仅在声明合适的模拟字段或参数后才会出现此类调用
也许我在这里误解了整个API,因为我认为我不想模拟这个类..只是测试调用私有方法的结果.
如果我正在写一个私有方法,那么rails会认为这个词下的每个方法private都是私有的吗?或者它应该只对第一种方法是私有的?
private
def signed_in_user
redirect_to signin_url, notice: "Please sign in." unless signed_in?
end
def correct_user
@user = User.find(params[:id])
redirect_to(root_path) unless current_user?(@user)
end
Run Code Online (Sandbox Code Playgroud)
这是否意味着signed_in_user和correct_user私人?还是只是signed_in_user?这是否意味着每当我需要编写私有方法时,它应该在我的文件的末尾?