English 中文(简体)
ASP.NET单元测试问题(奇怪的异常错误)
原标题:
  • 时间:2009-01-05 17:52:37
  •  标签:

我用最少量的代码创建了一个新的解决方案,以代表我遇到的问题。这是我能够简化到最简单的程度。

namespace EntServ.BusinessObjects
{
    /// <summary>
    /// Summary description for EntServSession
    /// </summary>
    public class EntServSession
    {
        public EntServSession()
        {

        }

        public static EntServSession Login(string username, string password)
        {
            EntServSession ret = null;

            if (username == "test"  && password == "pass")
                ret = new EntServSession();

            return ret;
        }

    }
}

我从一个新的解决方案开始,并在App_Code文件夹中创建了一个类,其中包含一个类似于我遇到问题的方法的静态方法。我右键单击类名,然后单击“创建单元测试...”。它提供了为我创建一个新的测试项目的选项,我接受了默认值并单击了“确定”。它生成了以下文件:

using EntServ.BusinessObjects;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Microsoft.VisualStudio.TestTools.UnitTesting.Web;
using System.Data;

namespace EntServObjectTests
{


    /// <summary>
    ///This is a test class for EntServSessionTest and is intended
    ///to contain all EntServSessionTest Unit Tests
    ///</summary>
    [TestClass()]
    public class EntServSessionTest
    {


        private TestContext testContextInstance;

        /// <summary>
        ///Gets or sets the test context which provides
        ///information about and functionality for the current test run.
        ///</summary>
        public TestContext TestContext
        {
            get
            {
                return testContextInstance;
            }
            set
            {
                testContextInstance = value;
            }
        }

        #region Additional test attributes
        // 
        //You can use the following additional attributes as you write your tests:
        //
        //Use ClassInitialize to run code before running the first test in the class
        //[ClassInitialize()]
        //public static void MyClassInitialize(TestContext testContext)
        //{
        //}
        //
        //Use ClassCleanup to run code after all tests in a class have run
        //[ClassCleanup()]
        //public static void MyClassCleanup()
        //{
        //}
        //
        //Use TestInitialize to run code before running each test
        //[TestInitialize()]
        //public void MyTestInitialize()
        //{
        //}
        //
        //Use TestCleanup to run code after each test has run
        //[TestCleanup()]
        //public void MyTestCleanup()
        //{
        //}
        //
        #endregion


        /// <summary>
        ///A test for Login
        ///</summary>
        // TODO: Ensure that the UrlToTest attribute specifies a URL to an ASP.NET page (for example,
        // http://.../Default.aspx). This is necessary for the unit test to be executed on the web server,
        // whether you are testing a page, web service, or a WCF service.
        [TestMethod()]
        [HostType("ASP.NET")]
        [AspNetDevelopmentServerHost("%PathToWebRoot%\EntServ2-ASP.NET\trunk\WWW", "/WWW")]
        [UrlToTest("http://localhost/WWW")]
        public void LoginTest()
        {
            string username = string.Empty; // TODO: Initialize to an appropriate value
            string password = string.Empty; // TODO: Initialize to an appropriate value
            EntServSession expected = null;
            EntServSession actual = EntServSession_Accessor.Login(username, password);
            Assert.AreEqual(expected, actual);
            Assert.Inconclusive("Verify the correctness of this test method.");
        }

    }
}

我尝试运行测试并且它试图编译,但是我收到了构建错误:

Error   1   
The type or namespace name  EntServSession  could not be found 
(are you missing a using directive or an assembly reference?)   C:ProjectsEntServ-ASP.NET	runkTestsEntServObjectTestsEntServSessionTest.cs
82
13
EntServObjectTests

我发布了网站并在测试项目中放置了对App_code.dll的引用,现在不再出现构建错误。相反,我得到了以下异常错误。我在类的每一行上都放置了断点,但调试器在任何行上都不停止。

Error Message
Test method EntServObjectTests.EntServSessionTest.LoginTest threw exception:  System.InvalidCastException: Unable to cast object of type  EntServ2.BusinessObjects.EntServSession  to type  EntServ2.BusinessObjects.EntServSession ..

Stack Trace
EntServ2.BusinessObjects.EntServSession_Accessor.Login(String username, String password)
EntServObjectTests.EntServSessionTest.LoginTest() in C:ProjectsEntServ2-ASP.NET	runkTestsEntServObjectTestsEntServSessionTest.cs: line 83
最佳回答

重新编辑:

我无法真正解决你的确切问题——InvalidCastException,因为这可能是那些让你花费数天来解决、使你拔发的误导/兔子洞问题之一。我相信这可能与发布程式集时版本不同有关吗?

我通常不这样做,如果我的建议不好,你可以给我投反对票。但我可以建议你将你的asp.net网站转换为Web应用程序(或将有问题的代码移动到类库)。我知道这不是你想要的答案,但这是一种艰苦的爱。长期来看,你会发现这样做会更容易,我不会详细解释它的所有好处,因为我相信你已经听说过它们或可以通过谷歌搜索到。

我相信这将是您问题的快速解决方案......毕竟,谁真的想在每次运行单元测试时都发布他们的网站?

问题回答

我觉得这个课程似乎与ASP.NET无关,也不需要任何服务器主机或模拟部署。你有这些行:

[TestMethod()]
[HostType("ASP.NET")]
[AspNetDevelopmentServerHost("%PathToWebRoot%\EntServ2-ASP.NET\trunk\WWW", "/WWW")]
[UrlToTest("http://localhost/WWW")]
public void LoginTest()
{
    string username = string.Empty; // TODO: Initialize to an appropriate value
    string password = string.Empty; // TODO: Initialize to an appropriate value
    EntServSession expected = null;
    EntServSession actual = EntServSession_Accessor.Login(username, password);
    Assert.AreEqual(expected, actual);
    Assert.Inconclusive("Verify the correctness of this test method.");
}

尝试去除不必要的组件,使之读起来如下:

[TestMethod()]
public void LoginTest()
{
    string username = string.Empty; // TODO: Initialize to an appropriate value
    string password = string.Empty; // TODO: Initialize to an appropriate value
    EntServSession expected = null;
    EntServSession actual = EntServSession_Accessor.Login(username, password);
    Assert.AreEqual(expected, actual);
    Assert.Inconclusive("Verify the correctness of this test method.");
}

此外,您根本没有使用测试上下文,现在可以考虑将它们移除。即您可以删除这些:

private TestContext testContextInstance;

/// <summary>
///Gets or sets the test context which provides
///information about and functionality for the current test run.
///</summary>
public TestContext TestContext
{
    get
    {
        return testContextInstance;
    }
    set
    {
        testContextInstance = value;
    }
}

这可能无法解决您的问题,但至少可以去除不必要的代码并使其简化。如果这不起作用,您可以在更改后断点测试的任何行吗?

此外,您可以尝试初始化您的字符串变量,以防问题出现在断点而不是测试本身。

最后,为什么您要使用访问器进行测试?您的测试代码似乎不需要访问任何私有成员,那么为什么不直接使用类的实例呢?

调试器在ASP.Net测试中无法工作。

使用System.Diagnostics.Debugger.Break作为一种解决方法。





相关问题
热门标签