我有一个用于在有序页面列表中来回导航的类.页面通常但不总是按顺序访问.有时可能会根据某些规则跳过一个或多个页面.
为了解决这个问题,我保留了两个向前和向后的堆栈,以跟踪先前在任一方向上访问过哪些页面.
就这个类的功能而言,它没有理由暴露这些堆栈.然而,当单元测试导航方法first(),next(),previous()并且last(),所有重组的堆栈,并返回相应的页面,我需要检查堆栈是在正确的"状态"的过程结束.
例如,调用first()应该清除前向堆栈,并将之前访问过的每个其他页面推送到后向堆栈.
这是否足以成为为前后堆叠提供吸气剂的理由?我犹豫不决的一个原因是,我担心这也会使他们暴露于(可能无意中)可能导致班级出现故障的外部操纵.如果客户端清除堆栈怎么办?
UPDATE
有人建议这个问题与此处发布的问题重复.我认为这两个问题并不完全相同.另一个问题讨论了重构私有方法以使其公开以便能够对其进行测试的想法.另一方面,这个问题具体是通过检查测试对象的内部状态来测试公共方法.我认为那里有一个微妙但显着的差异,并且接受的答案清楚地表明如何在不检查内部状态的情况下测试相同的公共方法.
是否可以在类私有方法上使用Jasmine单元测试框架的spyon方法?
文档给出了这个例子,但这可以灵活用于私有函数吗?
describe("Person", function() {
it("calls the sayHello() function", function() {
var fakePerson = new Person();
spyOn(fakePerson, "sayHello");
fakePerson.helloSomeone("world");
expect(fakePerson.sayHello).toHaveBeenCalled();
});
});
Run Code Online (Sandbox Code Playgroud)
提前致谢
我正在测试一个属于层次结构的类.我一直在用测试对象设置我的测试类,并且PrivateObject允许访问该对象.当我尝试访问父类的私有成员时,我遇到异常.
到目前为止,我发现的唯一解决方法是将PrivateType指定基类传递给PrivateObject构造函数,但是它不适用于子类的私有成员.
有没有办法可以做到这一点,也许是通过在Private对象的Get*方法上使用绑定flags参数?
我尝试使用自动生成的Accessor类(右键单击主类,Create Private Accessor).然而,情况更糟:它显示了我可以读取的属性,但它抛出与PrivateObject相同的异常,并且没有其他选项可以使用(绑定标志或诸如此类)来修复异常.
这是我的示例测试代码.我希望有一些方法来构造和使用PrivateObject来检索这两个字段.
public class BaseClass
{
private int one = 1;
}
public class SubClass : BaseClass
{
private int two = 2;
}
[TestClass]
public class UnitTest1
{
BindingFlags flags = BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
[TestMethod]
public void TestMethod1()
{
SubClass test = new SubClass();
PrivateObject priv = new PrivateObject(test);
Assert.AreNotEqual<int>(0, (int)priv.GetFieldOrProperty("one", flags)); // System.MissingMethodException: Method 'PrivateObjectTester.SubClass.one' not found.
Assert.AreNotEqual<int>(0, (int)priv.GetFieldOrProperty("two", flags));
}
[TestMethod]
public …Run Code Online (Sandbox Code Playgroud) 我正在尝试在一个初始化一些私有字段的类中对一个方法进行单元测试:
public void init(Properties props) throws Exception {
this.language = props.getProperty(Constants.LANGUAGE,Constants.LANGUAGE_DEFAULT);
this.country = props.getProperty(Constants.COUNTRY,Constants.COUNTRY_DEFAULT);
try {
this.credits = Integer.valueOf(props.getProperty(Constants.CREDITS_OPTION_NAME, Constants.CREDITS_DEFAULT_VALUE));
} catch (NumberFormatException e) {
throw new Exception("Invalid configuration: 'credits' does not contain a valid integer value.", e);
}
//rest of method removed for sake of simplicity
}
Run Code Online (Sandbox Code Playgroud)
我的困境是我想断言语言,国家和信用字段是在调用init之后设置的,但它们是私有的,没有公共访问器方法.我看到有两种解决方案可用于测试:
您认为测试此方法的理想方法是什么?
我正在尝试对具有公共和私有方法的类进行单元测试,并且我想对已设置为私有的特定方法(基础上的受保护抽象)进行单元测试.我不能使方法公开,我不想通过完整的过程来测试这个方法,我只关心这个方法的输入参数和返回满足期望.
这个问题强调我不想公开这个方法:
我的问题是,测试私有方法的各种方法有哪些,我应该采用哪种技术?为什么?
我已经阅读了这个问题(你如何对私人方法进行单元测试?)但是想知道接受的答案是否仍然是最好的答案,或者在几年后有更好的方法.
如果这个问题被认为是重复的,你如何对私有方法进行单元测试?我会在那里添加我的评论并要求更新,请指教.
unit-testing ×6
c# ×2
java ×2
.net ×1
jasmine ×1
javascript ×1
mstest ×1
nsubstitute ×1
nunit ×1
testing ×1