我正在用NUnit框架编写一个单元测试用例来测试我们的代码。
该代码引用了第三方库,如下所示:
class MyClass: BaseClass
{
public void override FunctionA()
{
var a = BaseFunctionB();
}
}
我们没有qazxsw poi的源代码,但qazxsw poi是非虚拟的。
我想要
BaseClass
但它不允许。
我只想测试BaseFunctionB
中的Setup(x=> x.BaseFunctionB()).Reteruns("my values");
,我不在乎它是否在FunctionA
中是正确的。
在这种情况下如何测试?
---------------------------- 2018-01-03更新---------------- -----------------我为MyClass
做了一些更新:
BasefunctionB
我做了一个测试BaseClass
的课程,如下所示:
public abstract class BaseClass1//we dont have source code for this class
{
public int GetValue()
{
//do something here
return 1;//
}
public abstract int GenerateOutPut();
}
class abstract class BaseClass2: BaseClass1
{
public new virtual int GetValue()
{
return base.GetValue();
}
}
class MyClass1: BaseClass2
{
public override int GenerateOutPut()
{
var a = GetValue();
a += 1;
return a;
}
}
class MyClass2: BaseClass2
{
public override int GenerateOutPut()
{
var a = GetValue();
a -= 1;
return a;
}
}
// there are many MyClass
class MyClassN: BaseClass2
{
public override int GenerateOutPut()
{
var a = GetValue();
//different logic here.
return a;
}
}
测试用例如下:
MyClass1
现在我必须创建许多看起来不太好的class TestClass1: MyClass1
{
public override int GetValue()
{
return 100;
}
}
。但在运行代码覆盖方面,我必须做到(我尝试使用模拟对象执行,报告中没有代码覆盖,我猜因为它创建代理并在代理上运行它,所以我创建相同的东西我自己来测试原始源代码)
我有更好的解决方案吗?
创建第二个基类和新成员以封装第三方依赖项是个好主意。它允许您覆盖派生类中的成员。一般来说,尽量避免嘲笑你不拥有的东西。而是将第三方依赖项封装在您控制的抽象背后,以便您可以灵活地模拟/存根/伪造任何所需的测试行为。
使用你的例子中的public void TestFunction()
{
var test = new TestClass1();
var result = test.GetValue();
assert.AreEqual(101, result);
}
TestClas
可以进行以下测试以验证受试者的预期行为。注意Moq允许通过在模拟对象上设置MyClass1
来调用基本成员。
public class MyClass1 : BaseClass2 {
public override int GenerateOutPut() {
var a = GetValue();
a += 1;
return a;
}
}
这几乎就像你手动但现在通过模拟代理一样。