2012-05-30 2 views
1

Мне грозит проблема, которую я не совсем понимаю.Отказывание атрибута (или геттера)

Я разрабатываю приложение на C#/ASP.net, используя Entity Framework. Я пытаюсь выполнить часть тестирования на нем, и поэтому мне нужно высмеять один из объектов, и я не могу его обработать.

Вот класс, я хочу, чтобы дразнить: http://pastebin.com/pMypAM7G

Этот класс возвращает новый DataSourceContainer если в настоящее время не существует один, и возвращает существующий в противном случае (это было нужно, чтобы избежать несколько контекстов)

Вот интерфейс (который только цель состоит в том, чтобы насмешливо): http://pastebin.com/LRYVdA9j

Вот fonction Я пытаюсь тест: http://pastebin.com/naVsV3FX

А вот тест fonction: http://pastebin.com/dY4ERzSJ

Когда я пытаюсь сделать тест, я получаю сообщение об ошибке на классе базы данных, в поглотителе, потому что нет HttpContext (что логично). Я не понимаю, что геттер должен быть издевательством.

Я пытался найти его в Интернете, но я не могу понять, что я делаю неправильно, поэтому, если кто-то может помочь мне в этом, я был бы очень благодарен. Благодаря !

ответ

1

Вы не правильно использовали свой код для поддержки модульного тестирования - вы создаете внешний объект (Database) в своем методе. Кроме того, вы не используете IDatabase интерфейс, но конкретная реализация Database

public static User Connexion(String login, String MotDePasse) 
    { 
     Database bdd = new Database(); // this is inline, concrete implementation, this cannot be mocked 

     User us = bdd._Context.UserSet.FirstOrDefault(u => u.login == login); 
     if (us == null) 
      throw new Exception("Nom d'utilisateur erroné"); 
     if (us.password != MotDePasse) 
      throw new Exception("Mot de passe erroné"); 
     else 
      return us; 
    } 

Вы должны прочитать по крайней мере о Dependency Injection.

Этот короткий пример может помочь вам понять проблемы в коде

public static User Connexion(String login, String MotDePasse, IDatabase bdd) 
    { 
     User us = bdd._Context.UserSet.FirstOrDefault(u => u.login == login); 
     if (us == null) 
      throw new Exception("Nom d'utilisateur erroné"); 
     if (us.password != MotDePasse) 
      throw new Exception("Mot de passe erroné"); 
     else 
      return us; 
    } 

На этот раз, Connexion слабо связан с интерфейсом IDatabase, а не к его реализации. Во время выполнения вы поставили бы new Database() в качестве своего значения, но во время тестирования, издевательства над реализацией.

+0

База данных - это конкретная реализация. В тестовой среде у вас должна быть возможность использовать другую реализацию, а не базу данных. Код, который вы получили сейчас, не может использовать альтернативную реализацию во время тестирования. – archil

+0

Хорошо, я неправильно понял цель насмешливой рамки. Теперь все ясно. Благодаря ! – BPruvost

+0

@Tahedoz вы можете:) – archil

1

Вы должны ввести свой объект базы данных в протестированный метод. Или, возможно, добавьте его в конструктор Userobjects и, возможно, сделайте его не статическим, поскольку он кажется статическим.

С предоставленным решением вы не используете надзорные объекты. Вы создаете конкретный объект внутри своей функции Connexion.

Смежные вопросы