2015-02-06 2 views
0

단위 테스트를 배우려고했는데 컨트롤러에서 단위 테스트 메서드를 사용하려고하는 TDD가 아닙니다. 유니티 3.5, Asp.Net MVC 5.1, 엔티티 프레임 워크 6.1.2, MS 테스트, NSubstitute 1.8.1.0 및 Visual Studio 2013 업데이트 3이 있습니다. 3 개의 프로젝트, 하나의 일반 MVC 5 프로젝트, 유닛 테스트 프로젝트 클래스 라이브러리는 모두 올바르게 참조되고 올바르게 작동합니다. 내 코드가 제대로 컴파일되고 모든 것이 잘됩니다. 지금 비동기 색인 작업을 테스트하려고하고 있으며 거기에 내 문제가 있습니다. 내가 내 컨텍스트에서 만들어 내 컨트롤러과 같이 것을 사용되는 인터페이스 그래서 나는 EF6 테스트에 대한 MSDN 설명서를 따라 :Asp.net mvc 비동기 컨트롤러 메서드 테스트

public interface ITestContext : IDisposable 
{ 
    IDbSet<Account> Accounts { get; set; } 
    IDbSet<Bank> Banks { get; set; } 
    DbEntityEntry Entry(object o); 
    int SaveChanges(); 
    Task<int> SaveChangesAsync(); 
} 

그럼 내 상황에 맞는 클래스입니다 그래서 같은 :

public class TestContext : DbContext, ITestContext 
{ 
    public TestContext(): base("DefaultConnection"){} 

    public virtual IDbSet<Account> Accounts { get; set; } 
    public virtual IDbSet<Bank> Banks { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 
     base.OnModelCreating(modelBuilder); 
    } 
    public override int SaveChanges() 
    { 
     return base.SaveChanges(); 
    } 

    public override Task<int> SaveChangesAsync() 
    { 
     return base.SaveChangesAsync(); 
    } 

    public DbEntityEntry Entity(object o) 
    { 
     return base.Entry(o); 
    } 
} 

그래서 저는 DI를 사용하는 컨트롤러에서 Interface를 사용합니다.

public class AccountsController : Controller 
{ 
    private ITestContext db; 

    public AccountsController(ITestContext _db) 
    { 
     db = _db; 
     //db1 = bnk; 
    } 

    // GET: Accounts 
    public async Task<ActionResult> Index() 
    { 
     var accounts = db.Accounts.Include(a => a.Bank); 
     return View(await accounts.ToListAsync()); 
    } 

내가 NSubstitute DbSet/IQueryable<T>에서 TestDbAsyncEnumerator 및 TestDbAsyncQueryProvider 복용 팁을 만들어 내 index 액션 그렇게 보이는, 그래서 내 모든 컨트롤러 방법은 비동기 방식이다. 그래서 짜증나는 것은이 인덱스 메소드를 테스트하기 위해서 무엇을해야할까요? 이것은 내가 얼마나 멀리 왔는지입니다.

누군가가 이것을 이해하고 올바른 방향으로 나를 가리 키도록 도와 줄 수 있습니까? 나는 블로그와 책을 읽었지만 아직도 내가 여기서해야만하는 것을 이해할 수 없다. 결과는 ActionResult의 Task입니다. 그래서 나는 무엇에 대해 주장합니까? 나는 당신이 모의에 맞서서 주장하고 의존성을 만족시키기 위해 스텁을 사용한다는 것을 배웠다. 그럼 내가 뭘해야하지? 내가 읽은 단위 테스트는 갈 길이며, 포기하고 싶지 않아 내가 여기서 뭘 할 수 있니? 도와주세요?!

+0

당신이해야할 일을 이해하지 못한다면 도움을받을 수있는 곳이 잘못되었습니다. 질문을 "내가 XXXX와 YYYY를 확인하고 싶습니다"와 같이 좀 더 구체적으로 바꾸어야합니다 ... –

+0

주세요. "결과가 ActionResult의 작업"이 코드 샘플에있는 위치를 명확히합니까? –

답변

1

나는 내가 볼 수있는 것에서 당신의 가능성이 너무 복잡하다고 생각합니다. 테스트의 개념은 모든 것을 가장 간단한 형태 (단위)로 분해하는 것입니다. 그래서 아마 테스트 목적으로 programatically 계정, 은행 등의 인스턴스를 만들 것입니다. 그 이유는 데이터베이스 변경없이 발생할 수있는 데이터 변경없이 논리가 자신의 논리를 수행하고 있는지 테스트하는 것입니다.

EF 테스트에서는 각 결과 집합에서 항목이 반환되는지 확인했습니다.

또한 수행 할 기본 EF 작업을 테스트합니다. 즉, 모든 은행을 반환합니까?, 모든 계정을 반환합니까?, 은행을 만들 수 있습니까?, 계정을 만들 수 있습니까? 등등.

NUnit을 사용하지만 대부분의 단위 테스트 프레임 워크는 비슷합니다.

본질적으로 테스트를 통과했는지 여부를 확인하고 테스트 통과 또는 실패를 정의해야합니다.

Assert.IsTrue(result.Equals("Hello World")); 

는 또한 셀레늄 형태를 테스트 할 때 매우 유용 할 수있는이 통합 :

이이만큼 간단한 일이 될 수 있습니다.

희망이 있습니다.

관련 문제