当子类尝试使用某个对象时,将丢失对该对象的引用

本文关键字:对象 引用 子类 | 更新日期: 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引用。