试图用外键测试类

时间:2016-05-27 04:08:19

标签: c# asp.net unit-testing mocking

我使用this教程来模拟我的项目并能够测试它。但我对具有外键的类有问题。

Post and put tests don't work

因为我有一个条件来验证id是否存在。像这样:

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

这是我的检查方法:

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

这是我的测试课程:

    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:我在发布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);

那么我的代码有什么问题?

修改1

这是错误(bd.Graduando为空): enter image description here

1 个答案:

答案 0 :(得分:0)

只要注意它,你的代码中的行似乎是一个转换错误:

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

如果转换失败,使用as运算符进行转换时,将获得null。查看MSDN以获取参考。

总结一下,引用文章:

  

as运算符就像一个强制转换操作。但是,如果转换不可能,as将返回null而不是引发异常。