我正在构建一个具有一些公共和私有方法的类库.我希望能够对私有方法进行单元测试(主要是在开发时,但它也可能对将来的重构有用).
这样做的正确方法是什么?
我来自Java EE世界,但现在我正在开发一个.Net项目.在Java中,当我想测试受保护的方法时,它非常简单,只需让具有相同包名的测试类就足够了.C#有什么类似的东西吗?单元测试受保护的方法有什么好的做法吗?我只发现框架和人们说我应该只测试公共方法.应该可以在没有任何框架的情况下做到这一点......
非常感谢.
我目前正在使用C#进行开发 - 这里有一些背景知识:我们用我们的客户端应用程序实现MVP,并且我们有一个循环规则,它规定没有方法应该具有大于5的圈复杂度.这会导致许多小的私有方法这通常是一件事.
我的问题是关于单元测试一个类:
通过公共方法测试私有实现都很好......我没有遇到实现这个问题的问题.
但是......以下情况如何:
示例1.处理异步数据检索请求的结果(回调方法不应仅供公开测试)
示例2.执行操作的事件处理程序(例如更新View标签的文本 - 我知道的愚蠢示例......)
示例3.您正在使用第三方框架,该框架允许您通过覆盖受保护的虚拟方法进行扩展(从公共方法到这些虚拟方法的路径通常被视为黑盒编程,并且将具有框架提供的各种依赖性你不想知道)
上面的例子在我看来并不是设计不佳的结果.他们似乎也没有成为单独进行单独测试的候选人,因为这样的方法会失去他们的背景.
没有人对此有任何想法吗?
干杯,杰森
编辑: 我认为我在原始问题中不够清楚 - 我可以使用访问器测试私有方法,并使用TypeMock模拟调用/方法.那不是问题.问题是测试不需要公开或不公开的东西.
我不想为了测试而公开代码,因为它可能会引入安全漏洞(只发布一个接口来隐藏它不是一个选项,因为任何人都可以将对象强制转换回其原始类型并获取访问权限我不希望他们)
被重构到另一个类进行测试的代码很好 - 但可能会失去上下文.我一直认为让'辅助'类可以包含一堆没有特定上下文的代码是不好的做法 - (在这里思考SRP).我真的不认为这适用于事件处理程序.
我很高兴被证明是错的 - 我只是不确定如何测试这个功能!我一直认为,如果它可以破坏或改变 - 测试它.
干杯,杰森
我正在尝试单元测试私有方法.我在这个问题上看到了下面的例子
Class target = new Class();
PrivateObject obj = new PrivateObject(target);
var retVal = obj.Invoke("PrivateMethod");
Assert.AreEqual(retVal);
Run Code Online (Sandbox Code Playgroud)
我的私人方法有2个参考参数.如何通过?
我有一个基本上像这样的结构:
abstract class A
{
protected string Identificator { get; set; }
private void DoSomething()
{
// ...
DoSomethingSpecific();
}
protected abstract void DoSomethingSpecific();
}
Run Code Online (Sandbox Code Playgroud)
由于我需要的复杂性,我们需要对DoSomething方法进行单元测试,以确保它以相同的方式运行.这就是我创建以下存根的原因.
public class AStub : A
{
protected override void DoSomethingSpecific()
{
// nothing to do
}
}
Run Code Online (Sandbox Code Playgroud)
我使用PrivateObject类来访问类A的方法和属性,实例化类AStub.这工作了一段时间,并且由于某种原因,每当我尝试访问属性或方法时崩溃.
以下代码用于测试:
var sut = new CommonIodAdapterImpl();
var accessor = new PrivateObject(sut);
accessor.SetProperty("Identificator", "blablub");
accessor.Invoke("DoSomething", null);
// assert...
Run Code Online (Sandbox Code Playgroud)
引发的异常是MissingMethodException,告诉我没有找到属性或方法.但是当我调试并检查层次结构时,每个似乎都是正确的拼写.
谢谢您的帮助.
我一直在看一些关于本地函数的文章,一句话说:
局部函数在方法中定义,不在其外部
所以鉴于下面的代码示例,是否有任何方法对该square方法进行单元测试?
int SumAndSquare(int x, int y)
{
var sum = x + y;
return square(sum);
int square(int z)
{
return z * z;
}
}
Run Code Online (Sandbox Code Playgroud) 如何为私有函数的out参数创建单元测试?
我的服务层:
private int LoadProduct(string productId, out IProduct product)
{
product = this.Load(productId);
return ErrorCodes.Success;
}
Run Code Online (Sandbox Code Playgroud)
测试用例:
[Test]
public void LoadProductTest()
{
var offerService = new OfferProcessor();
var privateOfferService = new PrivateObject(offerService);
IProduct myProduct = null;
var result = (int)privateOfferService.Invoke("LoadProduct",
new object[] {"AnId", myProduct });
Assert.That(result, Is.EqualTo(ErrorCodes.Success));
Assert.That(myProduct, Is.NotNull());
}
Run Code Online (Sandbox Code Playgroud)
上面的测试用例没有编译.如何通过调用out参数然后在调用后访问它?
如何为具有受保护方法的内部类型的类编写Nunit测试用例。我应该为此使用继承吗?以下是该类,我正尝试为其编写测试用例:-
internal class CSGetBuyerAbuseReportsRequestTanslator
{
protected override CSGetBuyerAbuseReportsRequestType BusinessToService(IEntityTranslatorService service, BuyerAbuseRequest value)
{
//code
}
}
Run Code Online (Sandbox Code Playgroud)
请给我建议如何为该类编写测试用例?