2009-08-07 2 views
2

TDD 및 MVP 패턴을 배우고 있습니다. TOAD SQL 도구 대신 사용할 수있는 간단한 WinForms 앱을 만들었습니다. 내가 다시 작성하고 내가 이미 작성한 코드에 대한 테스트를 작성하려고한다. (나는 TDD의 올바른 프로세스가 아니라는 것을 알고 있지만 나와 함께 견뎌야한다.)Winforms MVP 패턴이있는 Moq - 실패 테스트

양식의 테스트 클래스에서 콘크리트 Presenter을 테스트하고 싶지만 테스트를 거쳐 발표자에게 실제 로직이 있으므로 WinForm을 조롱합니다. 그러나 Moq을 사용하여보기를 조롱 할 때 예상되는 결과가 표시되지 않습니다. 아래 코드에서 처음 2 개는 PASS를 테스트하지만 첫 번째 Assert에서는 3 번째 FAILS를 테스트합니다. 내가 NUnit을하고 실행에 디버거를 연결하면

Environment 속성은 presenter.IsDangerousSQL가 호출 될 때 Environments.Test로 설정되지 않습니다

private Mock<IQueryForm> mockWindow; 
private QueryFormPresenter presenter; 

/// <summary> 
/// Runs ONCE prior to any tests running 
/// </summary> 
[TestFixtureSetUp] 
public void TestFixtureSetUp() 
{ 
    //We're interested in testing the QueryFormPresenter class here, but we 
    //don't really care about the QueryForm window (view) since there is hardly any code in it. 
    //Therefore, we create a mock of the QueryForm view, and pass it to the QueryFormPresenter to use. 
    mockWindow = new Mock<IQueryForm>(); 
    presenter = new QueryFormPresenter(mockWindow.Object); 
} 

[Test] 
public void User_Can_Execute_Selects_From_Any_Environment() 
{ 
    Assert.AreEqual(false, presenter.IsDangerousSQL("select 1")); 
} 

[Test] 
public void User_Cant_Execute_Schema_SQL_On_Any_Environment() 
{ 
    Assert.AreEqual(true, presenter.IsDangerousSQL("alter table")); 
    Assert.AreEqual(true, presenter.IsDangerousSQL("DrOp table")); 
} 

//Updates, Deletes and Selects are allowed in Test, but not in Production 
[Test] 
public void User_Can_Only_Execute_Updates_Or_Deletes_Against_Test() 
{ 
    //mockWindow.SetupSet(w => w.Environment = Environments.Test); 
    mockWindow.Object.Environment = Environments.Test; 
    Assert.AreEqual(false, presenter.IsDangerousSQL("update ")); 
    Assert.AreEqual(false, presenter.IsDangerousSQL("delete ")); 

    //mockWindow.SetupSet(w => w.Environment = Environments.Production); 
    //mockWindow.Object.Environment = Environments.Test; 
    Assert.AreEqual(true, presenter.IsDangerousSQL("update ")); 
    Assert.AreEqual(true, presenter.IsDangerousSQL("delete ")); 
} 

나는 크게 어떤 통찰력을 누군가가 제공 할 수있는 주셔서 감사합니다! 또한 IsDangerousSQL 메서드는 실제로 사용자 작업에 직접 반응하지 않고 비즈니스 논리를 나타내므로 실제로 Model 클래스에 있어야합니까?

감사합니다.

앤디

+0

주석 처리 된 코드를 설명 할 수 있습니까? 당신이 그것을 사용해야하는 것처럼 보입니다. –

+0

코드가 "View의 프리젠 테이션"과 관련된 경우 VM에 있어야합니다 (예 : 불량 SQL 강조 표시). 그렇지 않은 경우 (예 : 뷰가 아닌 클라이언트에서도 필요함) 모델 또는 유틸리티 클래스에 더 깊이 들어가야합니다. – Gishu

답변

1

테스트 대상 코드가 (즉 환경 속성을 호출 할 때 반환 할 것을 모의에게)

mockWindow.SetupGet(s => s.Environment).Returns(Environments.Test); 
대신 SetupSet의 SetupGet를 사용하고자하려는 환경 속성을 확인한다 가정하면

코드에서 속성을 설정하지 않았기 때문에.

또는 당신이

mockWindow.Object.Environment = Environments.Test; 

같은 문장을 쓸 때 당신이 무슨 일을하는지입니다 표준 등록으로 환경 속성을 치료하고 싶은 경우

mockWindow.SetupProperty(qf => qf.Environment); 

개인적으로 사용할 수 있습니다 나는 첫 번째 접근법을 선호한다.

+0

대단히 감사합니다 !! 두 번째 접근 방식은 mockWindow.Object.Environment = Environments.Test; mockWindow.SetupProperty (qf => qf.Environment);와 함께. 나는 첫 번째 접근 방식이 갈 길이지만 동의한다. 감사!! – Andy