Как предотвратить использование общих аргументов модульным тестированием VS2008 - PullRequest
0 голосов
/ 17 апреля 2009

У меня есть два класса, как это (в реальном проекте):

namespace app {
    internal class A {
    }

    internal class B {
        private List<A> list;
        private void SomeMethodToTest() {
            list = new List<A>() { new A() };
        }
    }

У меня есть мой юнит-тест, похожий на

[TestClass()]
public class ATest {
    [TestMethod()]
    public void TestSomeMethod() {
        B_Accessor b = new B_Accessor();
        b.SomeMethodToTest();
        Assert.AreEqual(1, b.list.Count); // ERROR ON THIS LINE
    }
}

В отмеченной строке я получаю исключение InvalidCastException, в котором говорится что-то вроде «невозможно привести объект типа System.Collections.Generic.List'1 [app.A] к типу System.Collections.Generic.List'1 [app.A_Accessor». ]

Проблема в том, что, поскольку A является внутренним, автоматически сгенерированный класс B_Accessor выглядит как

[Shadowing("app.B")]
public class B_Accessor : BaseShadow {
    ... stuff ...

    [Shadowing("list")]
    public List<A_Accessor> list { get; set; }

    ... stuff ...
}

Обратите внимание, что в классе Accessor список имеет тип List , а не List . Я указал атрибут InternalsVisibleTo в приложении, поэтому тестовый проект может получить доступ к типу A, но по какой-то причине VS заменяет его на тип доступа, что делает тип несовместимым с переносимым типом.

Как я могу обойти это, кроме как сделать А публичным?

Ответы [ 2 ]

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

Можно заменить тестовый проект чем-то вроде

internal static class AccessorExtensionMethods {
    internal static List<A> Get_list(this PrivateObject po) {
        return (List<A>)po.GetField("list");
    }
}

[TestClass()]
public class ATest {
    [TestMethod()]
    public void TestSomeMethod() {
        PrivateObject bpo = new PrivateObject(new B());
        B_Accessor b = new B_Accessor(bpo);
        b.SomeMethodToTest();
        Assert.AreEqual(1, bpo.Get_list().Count);
    }
}
0 голосов
/ 17 апреля 2009

Я удалил свой предыдущий ответ, потому что я не заметил, что вы уже используете InternalsVisibleToAttribute.

Что генерирует эти "вспомогательные" классы? Когда вы говорите «VS заменяет его на тип доступа», вы имеете в виду, что он меняет ваш исходный код? Это звучит очень странно - что произойдет, если вы вернете его для использования A и B вместо A_Accessor и B_Accessor?

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

У меня никогда не было проблем с использованием InternalsVisibleTo и непосредственным тестированием внутренних членов. (Ну, R # иногда путался в предыдущей версии, но кроме этого ...)

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