繁体   English   中英

模拟IHttpActionResult GetId方法的单元测试

[英]Unit Test Mocking an IHttpActionResult GetId method

我正在为控制器创建一些单元测试,但是遇到了问题。

基本上我有以下内容:

控制器方法:

[ResponseType(typeof(Attrib))]
public IHttpActionResult GetAttrib(int id)
{
    var attrib = _attribsRepository.GetAttrib(id);
    if (attrib == null)
    {
        return NotFound();
    }

    return Ok(attrib);
}

它是一种简单的Web API 2.0方法。

然后我有了存储库:

public Attrib GetAttrib(int id)
{
    return DbSet.FirstOrDefault(x=>x.Id == id);
}

最后是测试方法:

public class AttribsControllerTests
{
    public Mock<IAttribsRepository> _attribsRepositoryMock;
    public List<Attrib> AttribList;
    public AttribsController AttribsController;
    [SetUp]
    public void Init()
    {
        _attribsRepositoryMock = new Mock<IAttribsRepository>();
        AttribList = new List<Attrib>
        {
            new Attrib()
            {
                Id = 1,
                AttributeId = "Cro",
                AttributeName = "Crossing",
                AttributeType = "Tech",
                AttributeValue = 1
            },
            new Attrib()
            {
                Id = 2,
                AttributeId = "Dri",
                AttributeName = "Dribbling",
                AttributeType = "Tech",
                AttributeValue = 2
            },
            new Attrib()
            {
                Id = 3,
                AttributeId = "Fin",
                AttributeName = "Finishing",
                AttributeType = "Tech",
                AttributeValue = 3
            }
        };
    }

    [Test]
    public void Get_Check_That_Id1_Returns_Crossing()
    {
        //Arrange
        _attribsRepositoryMock.Setup(t => t.GetStaticAttribs()).Returns(AttribList.AsQueryable());

        //Act
        var attribsController = new AttribsController(_attribsRepositoryMock.Object);

        var result = attribsController.GetAttrib(1) as OkNegotiatedContentResult<Attrib>;

        //Assert
        Assert.IsNotNull(result);
        Assert.AreEqual(AttribList[0].AttributeName, "Cor");
    }
}

由于某种原因,结果始终为空,因此无法正确击中控制器。

任何想法为什么会发生这种情况? 调试时,正确的Mock存储库将命中控制器,并且其中应包含3个条目。

任何帮助将不胜感激。

您设置了GetStaticAttribs但是在显示的示例中没有使用它。 您应该设置IAttribsRepository.GetAttrib

根据你的例子

[Test]
public void Get_Check_That_Id1_Returns_Crossing() {
    //Arrange
    var id = 1;
    _attribsRepositoryMock.Setup(t => t.GetAttrib(id)).Returns(AttribList[0]);
    var attribsController = new AttribsController(_attribsRepositoryMock.Object);

    //Act
    var result = attribsController.GetAttrib(id) as OkNegotiatedContentResult<Attrib>;

    //Assert
    Assert.IsNotNull(result);
    Assert.IsNotNull(result.Content);
    Assert.AreEqual(result.Content.AttributeName, "Crossing");
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM