Проблема TDD в ASP.NET MVC3 (с DI) - PullRequest
0 голосов
/ 24 августа 2011

Я пытаюсь написать несколько тестов для небольшого моего проекта, но они, похоже, не работают (я начинаю с 1 теста 'Create_Class')

Я использую шаблон репозитория и использую инъекцию зависимости от конструктора:

public KlasController() {

    db = ObjectContextPerHttpRequest.Context;
    KlasRepo = new KlasRepository(db);
    LesRepo = new LesRepository(db);
    OpdrachtRepo = new OpdrachtRepository(db);
}

//dependency injection constructor
public KlasController(IKlasRepository KlasRepo, ILesRepository LesRepo, 
    IOpdrachtRepository OpdrachtRepo) {

    this.KlasRepo = KlasRepo;
    this.LesRepo = LesRepo;
    this.OpdrachtRepo = OpdrachtRepo;
}

вот мой TestClass с testinitializer (который запускается перед каждым тестом) и первый тест

[TestClass()]
public class KlasControllerTest
{
    private KlasController Controller;
    private IOpdrachtRepository OpdrachtRepo;

    //Use TestInitialize to run code before running each test
    [TestInitialize()]
    public void MyTestInitialize()
    {
        OpdrachtRepo = new DummyOpdrachtRepository();
        Controller = new KlasController(new DummyKlasRepository(),
            new DummyLesRepository(), OpdrachtRepo);
        Opdracht TestOpdracht = new Opdracht
        {
            OpdrachtID = 1,
            VakID = 1,
            StamNummer = "im1"
        };
        Vak TestVak = new Vak { VakID = 1, VakNaam = "FOOP" };
        TestOpdracht.Vak = TestVak;
        OpdrachtRepo.addOpdracht(TestOpdracht);
    }   

    /// <summary>
    ///A test for Index
    ///</summary>
    [TestMethod()]
    public void CreateKlasDirectsToToonKlassen()
    {
        Klas Klas = new Klas { KlasNaam = "2dNet" };
        RedirectToRouteResult view = Controller.Create(1) as RedirectToRouteResult;
        Assert.IsNotNull(view);                
        Assert.AreEqual("ToonKlassen", view.RouteValues["action"]);

    }
}

в тот момент, когда я получаю исключение nullreferenceException для представления (сбой assert.isNotNull)

и вот один из моих DummyRepository:

class DummyOpdrachtRepository : IOpdrachtRepository
{
    List<Opdracht> opdrachten; 

    public DummyOpdrachtRepository()
    {
        opdrachten = new List<Opdracht>();
    }

    public void addOpdracht(Opdracht opdracht)
    {
        opdrachten.Add(opdracht);
    }

    public string GetDocentID(int OpdrachtID)
    {
        var opdracht = opdrachten.Where(o => o.OpdrachtID == OpdrachtID).FirstOrDefault();
        return opdracht.StamNummer;
    }

    public Opdracht Find(int id)
    {
        return opdrachten.Where(o => o.OpdrachtID == id).FirstOrDefault();
    }
}

Обычно я должен был написать тесты. Прежде чем писать код, я знаю (и я убежден, что из TDD я его использовал)успешно в моем последнем Java-проекте).но это, похоже, не работает ..

вот код для KlasController.Create action

public ActionResult Create(int id) //id = opdrachtID 
{
    var Opdracht = OpdrachtRepo.Find(id);
    Vak vak;
    if(Opdracht != null)
        vak = Opdracht.Vak;
    else
        throw new NullReferenceException("Deze opdracht werd niet gevonden");
    return View(new CreateKlasModel(id,vak));
} 

Я знаю, что это много кода, но я действительно хочу сделатьэта работа.

Спасибо, что помогли мне заранее :)

1 Ответ

2 голосов
/ 25 августа 2011

Как уже сказал vladimir77 в своем комментарии, метод public ActionResult Create(int id) относится к типу ViewResult, поэтому либо вы меняете метод на return RedirectToRoute(), либо вы изменяете свой тест на

ViewResult view = Controller.Create(1);
Assert.IsNotNull(view); 

A ViewResult нельзя разыграть как RedirectToRouteResult.

...