我需要一个在其他测试的第一个测试中初始化的对象。 为了防止代码重复,我想将我在第一次测试中创建的对象保存在全局变量中。这就是我所做的:
namespace Project.WebUIV2.Tests {
[TestClass]
public class FilmSelectieControllerTests {
private FilmSelectieController controller;
[TestMethod]
public void CanInitializeController() {
Mock<IRepository<Voorstelling>> mockIRepository1 = new Mock<IRepository<Voorstelling>>();
Mock<IRepository<Film>> mockIRepository2 = new Mock<IRepository<Film>>();
Mock<IRepository<Zaal>> mockIRepository3 = new Mock<IRepository<Zaal>>();
Film film = new Film { titel = "Film" };
mockIRepository2.Setup(m => m.Add(film));
var repository1 = mockIRepository1.Object;
var repository2 = mockIRepository2.Object;
var repository3 = mockIRepository3.Object;
var controller = new FilmSelectieController(repository1, repository2, repository3);
Assert.IsNotNull(controller);
Assert.IsInstanceOfType(controller, typeof(FilmSelectieController));
this.controller = controller;
}
[TestMethod]
public void IsCreated() {
Assert.IsInstanceOfType(controller, typeof(FilmSelectieController));
}
}
}
Testmethod CanInitializeController()成功,而isCreated()失败。
在第一次测试中,我创建了FilmSelectieController对象。
如何在下次测试中使用该对象?
感谢Anthony Pegram
解决方案:
..*/
private Controller controller;
[TestInitialize]
public void Initialize() {
var parameter = /*...test data that i need in all tests...*/
this.controller = new Controller(parameter)
}
[TestMethod]
public void test1 {
result = controller.FirstMethod();
//assert something
}
[TestMethod]
public void test2 {
result = controller.SecondMethod();
//assert something
}
/*..
答案 0 :(得分:8)
创建一个在初始化时运行的方法,并设置该方法中所有测试都需要的任何对象。 (该方法将在每次测试之前重新运行,因此不要指望状态持续存在。)
[TestInitialize]
public void Initialize()
{
// your common setup code here
this.controller = ...
}
(TestInitialize
是MS Test下的属性,在您可能使用的大多数其他测试框架下将提供类似的属性。)
我通常会对我将在测试中使用的存根和模拟执行此操作。至于设置我正在测试的类,我通常会在测试方法本身处理它,或者将它重构为私有帮助器方法,但这只是个人偏好。如果所测试的被测试类的设置也是统一的,那么它也可以进入初始化方法。
答案 1 :(得分:6)
你正在混合几件事,所以让我指出这种方法有些不妥之处。
良好的单元测试是一项测试,其中包括速度,重复性等其他几个方面。这意味着其他测试的结果或顺序不应对另一个测试的结果产生影响。良好单元测试的每个方面都同样重要,因为如果没有它们,您最好不要首先使用单元测试。
如果您的测试依赖于某段代码才能正常工作,那么您可以在适当的范围(程序集或类初始化)中初始化它。您可以使用[Initalize]
或[AssemblyInitialize]
注释(大多数情况下您希望进行类初始化)。
重要提示:这些不是测试!
再看一下上面显示的代码。让我总结一下你做的事情:
Film
对象这有三个原因:
您的代码中没有任何地方在测试您的实际问题域,您只需设置测试内容即可。还要注意,你的嘲笑的一些更清晰的名字不会受到伤害。也无法保证单个类中单元测试的运行顺序。
答案 2 :(得分:0)
我认为你必须使用装饰器[TestInitialize]
这用于在执行所有[TestMethods]之前使测试序列无法使用