我使用this教程来模拟我的项目并能够测试它。但我对具有外键的类有问题。
因为我有一个条件来验证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
答案 0 :(得分:0)
只要注意它,你的代码中的行似乎是一个转换错误:
var result = controller.PostBeneficio(item) as CreatedAtRouteNegotiatedContentResult<Beneficio>;
如果转换失败,使用as运算符进行转换时,将获得null。查看MSDN以获取参考。
总结一下,引用文章:
as
运算符就像一个强制转换操作。但是,如果转换不可能,as
将返回null而不是引发异常。