Проблемы модульного тестирования ASP.NET (странная ошибка исключения) - PullRequest
0 голосов
/ 05 января 2009

Я создал новое решение с минимальным количеством кода, представляющего проблему, с которой я столкнулся. Это самое простое, до чего я мог добраться.

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:\Projects\EntServ-ASP.NET\trunk\Tests\EntServObjectTests\EntServSessionTest.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:\Projects\EntServ2-ASP.NET\trunk\Tests\EntServObjectTests\EntServSessionTest.cs: line 83

Ответы [ 3 ]

1 голос
/ 05 января 2009

Re-редактирование:

Я не могу действительно решить вашу проблему с InvalidCastException, поскольку это, вероятно, одна из тех проблем с "красной сельдью" и "кроличьей нерой", на которые у вас уйдут дни, чтобы разобраться и вырвать много волос. Я уверен, что это будет как-то связано с различными версиями сборок, когда вы публикуете их ??

Обычно я этого не делаю, и вы можете проголосовать за плохой совет, но могу ли я порекомендовать вам преобразовать ваш сайт asp.net в веб-приложение? (либо это, либо переместите нарушающий код в библиотеку классов). Я знаю, что это не тот ответ, который вы ищете, но это жесткая любовь, что я могу сказать. В долгосрочной перспективе вы обнаружите, что это будет намного проще, и я не буду вдаваться во все преимущества, так как уверен, что вы о них слышали или можете гуглить.

Я уверен, что это будет гораздо более быстрым решением вашей проблемы ... и в конце концов, кто действительно хочет публиковать свой сайт каждый раз, когда запускает свои юнит-тесты?

0 голосов
/ 17 января 2009

Отладчик не работает с тестами ASP.Net.

Использование System.Diagnostics.Debugger.Break для работы

0 голосов
/ 06 января 2009

Мне не кажется, что этот класс имеет какое-либо отношение к 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;
    }
}

Это может не решить вашу проблему, но, по крайней мере, удалит ненужный код и может упростить его. Если это не работает, можете ли вы поставить точку останова в любой строке теста после внесения изменений?

Кроме того, вы можете попробовать инициализировать строковые переменные на тот случай, если проблема связана с точками останова, а не с самим тестом.

Наконец, почему вы тестируете с помощью Accessor? Ваш тестовый код, по-видимому, не требует доступа к каким-либо закрытым членам, так почему бы не использовать juse экземпляр самого класса?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...