2012-05-30 5 views
1

나는 꽤 이해가 안되는 문제에 직면 해있다.속성 (또는 getter)을 조롱하다

저는 C#/ASP.net에서 Entity Framework를 사용하여 응용 프로그램을 개발하고 있습니다. 일부 단위 테스트를 수행하려고하므로 개체 중 하나를 조롱해야하며 해결할 수 없습니다. 여기

내가 조롱하려는 클래스입니다 : 아무도 현재 존재하지 않는 경우 http://pastebin.com/pMypAM7G

이 클래스는 새로운 DataSourceContainer을 반환하고, 기존 그렇지 않으면

(여러 상황을 피하기 위해 그것을 필요로) 반환 http://pastebin.com/naVsV3FX

,536 : 여기

http://pastebin.com/LRYVdA9j 내가 시험에 애 쓰고 fonction입니다 : 여기에 (유일한 목적은 조롱 수 있도록하는 것입니다) 인터페이스입니다

그리고 여기에 테스트의 성격이 있습니다 : http://pastebin.com/dY4ERzSJ

테스트를 시도 할 때 HttpContext (논리적)가 없기 때문에 getter 내에서 Database 클래스에 오류가 발생합니다. 내가 얻지 못하는 것은 getter가 조롱받는 것으로되어 있다는 것입니다.

인터넷에서 찾아보기 위해 노력했지만 잘못한 부분을 파악할 수 없으므로 누군가 나를 도와 줄 수 있다면 정말 감사 할 것입니다. 감사 !

답변

1

단위 테스트를 지원하기 위해 코드를 제대로 구현하지 않았습니다. 메소드에 외부 객체 (Database)를 생성하고 있습니다. 또한, 당신은 적어도 약 Dependency Injection을 읽어야 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; 
    } 

의 구체적인 구현되지 않습니다.

이 짧은 예를 들어 당신이 당신의 코드

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; 
    } 

에이 시간 문제를 이해하는 데 도움이 될 수 있습니다, 커넥션은 느슨하게하지 구현에, IDatabase 인터페이스에 바인딩됩니다. 런타임에는 new Database()을 값으로 제공하지만 테스트시에는 조롱 된 구현을 제공합니다.

+0

데이터베이스가 구체적으로 구현되었습니다. 테스트 환경에서는 Database가 아닌 다른 구현을 사용할 수 있어야합니다. 현재 가지고있는 코드는 테스트시 대체 구현을 사용할 수 없습니다. – archil

+0

좋아요, 저는 조롱하는 프레임 워크의 목적을 오해했습니다. 이제 모든 것이 명확 해집니다. 감사 ! – BPruvost

+0

@Tahedoz 당신을 환영합니다 :) – archil

1

테스트 된 방법에 DatabaseObject를 삽입해야합니다. 또는 바람직하게 그것을 Userobjects 생성자에 삽입하고 정적 인 것처럼 보이게 만들 수도 있습니다.

제공된 솔루션을 사용하면 조롱 된 개체가 사용되지 않습니다. Connexion 함수 안에서 구체적인 객체를 생성하고 있습니다.