繁体   English   中英

模拟的存储库返回的对象具有空属性

[英]Mocked repository returning object with null properties

这是我的一个单元测试课程的示例(精简为基础)。 在控制器中,当调用Index()操作方法时,对GetByID(1234)的调用总是导致Ticket对象的更新实例。 该对象存在,但是即使我在伪造的对象中设置了它们,其所有属性都为null。 有什么想法吗?

我正在使用起订量。

单元测试

    [TestClass]
    public class TicketControllerTests : ControllerTestBase
    {
        protected Mock<ITicketRepository> MockTicketRepository = new Mock<ITicketRepository>();

        [TestMethod]
        public void IndexActionModelIsTypeOfTicketModel()
        {
            //ARRANGE
            Mock<HttpContextBase> context = FakeHttpContext();
            context.Setup(ctx => ctx.Session[SessionKeys.TokenData.ToString()]).Returns(Constants.TOKENDATA_SUBMITTER);

            MockTicketRepository.Setup(x => x.GetById(It.IsAny<int>())).Returns(Constants.CLIENT_TICKET);

            //ACT
            var result = GetController(context.Object).Index(Constants.TICKET_ID);
            var model = ((ViewResult)result).Model;

            //ASSERT
            Assert.IsInstanceOfType(model, typeof(TicketModel), "ViewModel should have been an instance of TicketModel.");
        }

        private TicketController GetController(HttpContextBase context)
        {
            var controller = new TicketController(MockTicketRepository.Object);
            controller.ControllerContext = GetControllerContext(context, controller);
            return controller;
        }
    }

常量。CLIENT_TICKET

public static Ticket CLIENT_TICKET
        {
            get
            {
                var ticket = new Ticket
                {
                    CategoryID = 1,
                    CreatedByUserId = 4
                };

                ticket.Clients.Add(new Client { ShortName = "Test Client 1"});
                ticket.Clients.Add(new Client { ShortName = "Test Client 2" });

                ticket.User = new User {FirstName = "First", LastName = "Last"};

                return ticket;
            }
        }

调节器

private readonly ITicketRepository _ticketRepository;

public TicketController(ITicketRepository ticketRepository)
{
    _ticketRepository = ticketRepository;
}

public ActionResult Index(int id)
{
    var ticket = _ticketRepository.GetById(id);

    // etc...
}

您可以显示受测控制器代码吗? 它可能与您如何设置模拟上下文有关,但是如果不查看控制器代码就很难分辨。

另外,如果在创建模拟时添加MockBehavior.Strict ,则在调用没有相应期望的情况下,它将炸毁:

protected Mock<ITicketRepository> MockTicketRepository = new Mock<ITicketRepository>(MockBehavior.Strict);

更新我尝试将所有内容剥离,以便使测试尽可能简单,以找出问题所在。 这是我想出的:

[TestClass]
public class TicketControllerTests : ControllerTestBase
{
    protected Mock<ITicketRepository> MockTicketRepository;

    [TestMethod]
    public void IndexActionModelIsTypeOfTicketModel()
    {
        //ARRANGE
        MockTicketRepository = new Mock<ITicketRepository>(MockBehavior.Strict);
        MockTicketRepository.Setup(x => x.GetById(Constants.TICKET_ID)).Returns(Constants.CLIENT_TICKET);
        var controller = new TicketController(MockTicketRepository.Object);

        //ACT - try to keep ACT as lean as possible, ideally just the method call you're testing
        var result = controller.Index(Constants.TICKET_ID);

        //ASSERT
        var model = ((ViewResult)result).ViewData.Model;
        Assert.That(model, Is.InstanceOfType<TicketModel>(), "ViewModel should have been an instance of TicketModel.")
    }
}

暂无
暂无

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

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