ASP.NET MVC3 中的 TDD 问题(使用 DI)

发布于 2024-12-01 14:08:33 字数 3015 浏览 1 评论 0原文

我正在尝试为我的一个小项目编写一些测试,但它们似乎失败了(我从 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;
}

这是我的带有 testinitializer 的 TestClass(在之前运行) 第一个测试

[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 操作的代码

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

我知道这是很多代码,但我真的想让它工作。

感谢您提前帮助我:)

I am attempting to write some Tests for a small project of mine but they seem to fail (I am starting with 1 test 'Create_Class')

I use the repository pattern and use Constructor Dependency Injection:

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

here is my TestClass with testinitializer (which runs before every test) and the first test

[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"]);

    }
}

at the moment I get a nullreferenceException on the view (assert.isNotNull fails)

and here is one of my DummyRepository's:

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

Normally I should have written the tests Before writting the code, I know (and I am convinced off TDD, as I have used it successfully in my latest Java-project). but it just doesn't seem to work..

here is the code for 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));
} 

I know this is a lot of code, but I really want to make this work.

Thanks for helping me out in advance :)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

是伱的 2024-12-08 14:08:33

正如 vladimir77 在他的评论中已经说过的,方法 public ActionResult Create(int id) 是 ViewResult 类型,因此您可以更改方法以执行 return RedirectToRoute() 或您将测试更改为

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

ViewResult 无法转换为RedirectToRouteResult

As vladimir77 already says in his comment, the method public ActionResult Create(int id) is of type ViewResult, so either you change you method to do areturn RedirectToRoute() or you change your test to

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

A ViewResult can not be cast as a RedirectToRouteResult.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文