gpt4 book ai didi

c# - 使用来自第 3 方程序集的对象进行单元测试

转载 作者:行者123 更新时间:2023-11-30 21:07:52 25 4
gpt4 key购买 nike

我有一个 Visual Studio 2008 C# .NET 3.5 项目,我正在为其实现单元测试,但我遇到了一个问题。我的代码引用了一个使用内部构造函数实现对象的第 3 方程序集。

例如:

// in 3rd party assembly
public class Bar
{
// internal constructor
internal Bar();
public int Id { get; }
public string Name { get; }
public Foo Foo { get; }
}

public class Foo
{
// internal constructor
internal Foo();
public Collection<Bar> GetBars();
}

我想进行单元测试的一种方法是:

// in my assembly
public static Bar FindByName(this Collection<Foo> c, string name)
{
// search through the Foos to find the first bar with the matching name
}

然后像这样测试它:

void TestMethod()
{
Collection<Foo> foo_pool = new Collection<Foo>()
{
new Foo() { /*..*/ } // Error! ctor is inaccessible
};

Bar b = foo_pool.FindByName("some_name");
assert_equal (b.Name, "some_name");
}

但是,我无法创建类型为 Foo 或类型为 Bar 的对象。那么,如何对我的方法进行单元测试?

谢谢

最佳答案

对于单元测试,您可以使用 PrivateObject 类(命名空间 Microsoft.VisualStudio.TestTools.UnitTesting)创建具有私有(private)构造函数的对象,甚至测试私有(private)方法。

http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.privateobject(v=vs.90).aspx

http://www.gangleri.net/2007/11/15/PrivateObjects.aspx

这是一个例子:

[TestMethod]
public void TestMethod2()
{
// Arrange
var po = new PrivateObject(typeof(MyObject));
var obj = (MyObject)po.Target;
// Act
var result = obj.Calculate(2);
// Assert
Assert.AreEqual(3, resul);
}

public class MyObject
{
internal MyObject()
{

}

public int Calculate(int a)
{
return 1 + a;
}
}

它以与 Jim 的建议相同的方式使用反射,但 PrivateObject 类封装了使用私有(private)构造函数创建实例的所有工作。

关于c# - 使用来自第 3 方程序集的对象进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10032314/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com