jeudi 26 mai 2016

Trying to test class with foreign key

I used this tutorial to mock my project and be able to test it. But I have problems with classes that have foreign key.

Post and put tests don't work

Because I have a condition that verifies if the id exists. Like this one:

// POST: api/Beneficio
    [ResponseType(typeof(Beneficio))]
    public IHttpActionResult PostBeneficio(Beneficio beneficio)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        if (!GraduandoExists(beneficio.graduandoID))
        {
            return NotFound();
        }

        db.Beneficio.Add(beneficio);
        db.SaveChanges();

        return CreatedAtRoute("DefaultApi", new { id = beneficio.beneficioID }, beneficio);
    }

This is my check method:

private bool GraduandoExists(int id)
    {
        return db.Graduando.Count(e => e.GraduandoId == id) > 0;
    }

And this is my test class:

    using System.Net;
using System.Web.Http.Results;
using NUnit.Framework;
using Prac.Controllers;
using Prac.Models;
using Prac.Tests.Db;


namespace Prac.Tests.Controllers
{
    [TestFixture]
    public class BeneficioControllerTests
    {
        [Test]
        public void PostBeneficio_ShouldReturnSameBeneficio()
        {
            var controller = new BeneficioController(new TestPracContext());

            var item = GetDemoBeneficio();

            var result =
                controller.PostBeneficio(item) as CreatedAtRouteNegotiatedContentResult<Beneficio>;

            Assert.IsNotNull(result);
            Assert.AreEqual(result.RouteName, "DefaultApi");
            Assert.AreEqual(result.RouteValues["id"], result.Content.beneficioID);
            Assert.AreEqual(result.Content.munB, item.munB);
            Assert.AreEqual(result.Content.nomeB, item.nomeB);
            Assert.AreEqual(result.Content.valorB, item.valorB);
        }

        [Test]
        public void PutBeneficio_ShouldReturnStatusCode()
        {
            var controller = new BeneficioController(new TestPracContext());

            var item = GetDemoBeneficio();

            var result = controller.PutBeneficio(item.beneficioID, item) as StatusCodeResult;
            Assert.IsNotNull(result);
            Assert.That(result, Is.InstanceOf(typeof(StatusCodeResult)));
            Assert.AreEqual(HttpStatusCode.NoContent, result.StatusCode);
        }

        [Test]
        public void PutBeneficio_ShouldFail_WhenDifferentID()
        {
            var controller = new BeneficioController(new TestPracContext());

            var badresult = controller.PutBeneficio(999, GetDemoBeneficio());
            Assert.That(badresult, Is.InstanceOf(typeof(BadRequestErrorMessageResult)));
        }

        [Test]
        public void GetBeneficio_ShouldReturnBeneficioWithSameID()
        {
            var context = new TestPracContext();
            context.Beneficio.Add(GetDemoBeneficio());

            var controller = new BeneficioController(context);
            var result = controller.GetBeneficio(3) as OkNegotiatedContentResult<Beneficio>;

            Assert.IsNotNull(result);
            Assert.AreEqual(3, result.Content.beneficioID);
        }

        [Test]
        public void GetBeneficios_ShouldReturnAllBeneficios()
        {
            var context = new TestPracContext();
            ApplicationUser user1 = new ApplicationUser { Id = "1" };
            var g1 = new Graduando { GraduandoId = 1, UsuarioId = "1", ApplicationUser = user1};
            var b1 = new Beneficio { beneficioID = 3, graduandoID = 3, munB = "mun1", nomeB = "nome1", valorB = 1, Graduando = g1 };
            var b2 = new Beneficio { beneficioID = 3, graduandoID = 3, munB = "mun1", nomeB = "nome1", valorB = 1, Graduando = g1 };
            var b3 = new Beneficio { beneficioID = 3, graduandoID = 3, munB = "mun1", nomeB = "nome1", valorB = 1, Graduando = g1 };

            context.Beneficio.Add(b1);
            context.Beneficio.Add(b2);
            context.Beneficio.Add(b3);

            var controller = new BeneficioController(context);
            var result = controller.GetBeneficio() as TestBeneficioDbSet;

            Assert.IsNotNull(result);
            Assert.AreEqual(3, result.Local.Count);
        }

        [Test]
        public void DeleteBeneficio_ShouldReturnOK()
        {
            var context = new TestPracContext();
            var item = GetDemoBeneficio();
            context.Beneficio.Add(item);

            var controller = new BeneficioController(context);
            var result = controller.DeleteBeneficio(3) as OkNegotiatedContentResult<Beneficio>;

            Assert.IsNotNull(result);
            Assert.AreEqual(item.beneficioID, result.Content.beneficioID);
        }

        Beneficio GetDemoBeneficio()
        {
            ApplicationUser user = new ApplicationUser { Id = "1" };
            var graduando = new Graduando {GraduandoId = 3, UsuarioId = "1", ApplicationUser = user};
            return new Beneficio { beneficioID = 3, graduandoID = 3, munB = "mun1", nomeB = "nome1", valorB = 1, Graduando = graduando};
        }
    }
}

OBS: I already try this before posting beneficio:

            var context = new TestPracContext();
        var controller = new BeneficioController(context);
        ApplicationUser user = new ApplicationUser { Id = "1" };
        var graduando = new Graduando { GraduandoId = 3, UsuarioId = "1", ApplicationUser = user };
        var controller2 = new GraduandoController(context);
        controller2.PostGraduando(graduando);
        var b = new Beneficio { beneficioID = 3, graduandoID = 3, munB = "mun1", nomeB = "nome1", valorB = 1, Graduando = graduando };

        var item = GetDemoBeneficio();

        var result =
            controller.PostBeneficio(b) as CreatedAtRouteNegotiatedContentResult<Beneficio>;

        Assert.IsNotNull(result);

So what's wrong with my code?

Aucun commentaire:

Enregistrer un commentaire