【发布时间】:2014-07-20 07:56:09
【问题描述】:
我在 MS Visual C# 2010 Express 中创建了两个项目。第一个项目有一个类 SugarcrmLogin,方法是 TheSugarCrmLoginTest()。
第二个项目有一个带有 Main 方法的类 Sugarcrm。这个项目引用了第一个项目的项目dll。
在 Main 方法中,我实例化了 SugarcrmLogin 类并调用了 SugarCrmLoginTest() 方法。
这里是第二个项目中Main方法的代码,这里我实例化了类并调用了方法:
public static void Main()
{
SugarcrmLogin Login;
Login = new SugarcrmLogin();
Login.TheSugarcrmLoginTest();
}
两个项目都在 MS Visual C# 中成功构建,但是当我尝试使用 Nunit 运行第二个项目的项目 dll 时,我收到错误“对象引用未设置为对象的实例”并引用了 TheSugarCrmLoginTest( ) 方法在第一个项目中。
第一个项目
using System;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium.IE;
using OpenQA.Selenium.Support.UI;
namespace SeleniumTests
{
[TestFixture]
public class SugarcrmLogin
{
private IWebDriver driver;
private StringBuilder verificationErrors;
private string baseURL;
private bool acceptNextAlert = true;
[SetUp]
public void SetupTest()
{
//driver = new FirefoxDriver();
driver = new InternetExplorerDriver();
baseURL = "http://127.0.0.1/";
verificationErrors = new StringBuilder();
}
[TearDown]
public void TeardownTest()
{
try
{
driver.Quit();
}
catch (Exception)
{
// Ignore errors if unable to close the browser
}
Assert.AreEqual("", verificationErrors.ToString());
}
[Test]
public void TheSugarcrmLoginTest()
{
driver.Navigate().GoToUrl(baseURL + "/sugarcrm/index.php?module=Users&action=Login");
driver.FindElement(By.Id("user_name")).Clear();
driver.FindElement(By.Id("user_name")).SendKeys("admin");
driver.FindElement(By.Id("user_password")).Clear();
driver.FindElement(By.Id("user_password")).SendKeys("admin");
driver.FindElement(By.Id("login_button")).Click();
}
private bool IsElementPresent(By by)
{
try
{
driver.FindElement(by);
return true;
}
catch (NoSuchElementException)
{
return false;
}
}
private bool IsAlertPresent()
{
try
{
driver.SwitchTo().Alert();
return true;
}
catch (NoAlertPresentException)
{
return false;
}
}
private string CloseAlertAndGetItsText()
{
try
{
IAlert alert = driver.SwitchTo().Alert();
string alertText = alert.Text;
if (acceptNextAlert)
{
alert.Accept();
}
else
{
alert.Dismiss();
}
return alertText;
}
finally
{
acceptNextAlert = true;
}
}
}
}
第二个项目:
using System;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium.IE;
using OpenQA.Selenium.Support.UI;
namespace SeleniumTests
{
[TestFixture]
public class Sugarcrm
{
public IWebDriver driver;
private StringBuilder verificationErrors;
public string baseURL;
private bool acceptNextAlert = true;
[SetUp]
public void SetupTest()
{
//driver = new FirefoxDriver();
driver = new InternetExplorerDriver();
baseURL = "http://127.0.0.1/";
verificationErrors = new StringBuilder();
}
[TearDown]
public void TeardownTest()
{
try
{
driver.Quit();
}
catch (Exception)
{
// Ignore errors if unable to close the browser
}
Assert.AreEqual("", verificationErrors.ToString());
}
[Test]
public static void Main()
{
SugarcrmLogin Login;
Login = new SugarcrmLogin();
Login.TheSugarcrmLoginTest();
}
private bool IsElementPresent(By by)
{
try
{
driver.FindElement(by);
return true;
}
catch (NoSuchElementException)
{
return false;
}
}
private bool IsAlertPresent()
{
try
{
driver.SwitchTo().Alert();
return true;
}
catch (NoAlertPresentException)
{
return false;
}
}
private string CloseAlertAndGetItsText()
{
try
{
IAlert alert = driver.SwitchTo().Alert();
string alertText = alert.Text;
if (acceptNextAlert)
{
alert.Accept();
}
else
{
alert.Dismiss();
}
return alertText;
}
finally
{
acceptNextAlert = true;
}
}
}
}
【问题讨论】:
-
可以下断点,启动后查看Login变量是否为空
-
这听起来很可能是错误被引发inside
TheSugarcrmLoginTest(),在这种情况下没有代码(更新:现在在编辑中提供)我们甚至不能希望告诉你什么;但是:堆栈跟踪是什么? -
@YuliamChandra 虽然有是一种使
new SomeClass()返回null的方法,这是一个极端边缘情况(我唯一的时候'已经曾经在极端疯狂的编码示例中看到它)