当子类尝试使用某个对象时,将丢失对该对象的引用
本文关键字:对象 引用 子类 | 更新日期: 2023-09-27 18:26:33
这对我来说很奇怪,它一定是显而易见的,但当使用Selenium时,谁知道。。。我直到现在才用硒。
但这只是我认为的基本代码,我认为这只是一个语法/OOP问题,但不确定是什么。
比方说,我有一个基类,它有一个驱动程序属性和一个方法,我稍后会遇到问题:
public Abstract BaseTest
{
protected IWebTestDriver TestDriver {get; set;}
...more code
protected void WaitForGridToRender(double seconds)
{
TestDriver.Wait(TimeSpan.FromSeconds(seconds));
}
}
然后,我有一个名为MyTests.cs的测试类,它继承了BaseTest,其中有一个NUnit测试:
[TestFixture]
public class MyTests : BaseTest
{
[Test]
public void SomeTab_WhenClicked_ShowsSomething()
{
SomeLandingPage someLandingPage = new SomeLandingPage(TestDriver);
mainLandingPage.NavigateToTheMainPage();
... rest of code
}
.. other test methods
}
我有一个第三类,它充当"PageObject",允许我只重用页面上的某些元素,处理一些事情(更DRY),而不是在整个测试方法中重复这些相同的通用方法:
public class MyPageObject : BaseWebTest
{
public void NavigateToTheMainPage()
{
// wait for the user to log in
WaitForGridToRender(5);
}
}
下面是我的问题所在,以及事情是如何被称为:
1) 基类首先初始化。。。这意味着TestDriver的实例被创建并设置为TestDriver属性,这样我们就可以在的子类中使用它
2) 最终,我在这里没有提到的另一个类中的一些代码是从基类调用的,基类只是发送一些调用来打开FireFox,做一些事情。。。这里没有什么特别的
3) 最终,控制转到我的测试方法,并最终命中SomeTab_WhenClicked_ShowsSomething()方法,该方法随后调用MyPageObject.NavigateToTheMainPage()方法。
NavigateToTheMainPage()尝试调用名为WaitForGridToRender的BaseTest方法,控件最终到达那里。
现在的问题是,直到从MyPageObject中调用WaitForGridToRender时,BaseTest.TestDriver实例已经存在,并且我的测试类和PageObject类都可以访问该实例。
但当我最终调试并在WaitForGridToRender中到达这一行时:
TestDriver.Wait(seconds);
现在由于某种原因,我在TestDriver上得到了一个null ref。。。该属性的引用实例已不存在!
不知道为什么,这就是我发布这篇文章的原因,因为我不知道为什么会发生这种情况。
1) 基类首先初始化。。。这意味着TestDriver的实例被创建并设置为TestDriver属性,这样我们就可以在的子类中使用它
此代码
protected IWebTestDriver TestDriver {get; set;}
声明了一个名为TestDriver
的类型为IWebTestDriver
的受保护属性。
除非您在构造函数或方法中将TestDriver
设置为此处未显示的内容,否则TestDriver
的支持变量包含null引用。