2

我目前在测试我的控制器使用的模拟方法时遇到问题。它具有特定枚举的返回类型。我目前总是从这个模拟方法返回默认枚举值,而不是我指定它返回的值。我错过了什么吗?我已经尝试过 Moq 和 JustMock lite,结果相同。JustMock 精简版示例如下。

希望我在复制代码时没有犯任何错误,我已经更改了所有对象的名称,因此对此深表歉意。

这是单元测试的一部分:

        var returnStatus = ExampleEnum.Invalid;

        //Mock the client
        var client = Mock.Create<ITestInterface>();

        Mock.Arrange(() => client.ValidateSomething(Guid.NewGuid()))
            .Returns(returnStatus).MustBeCalled();


        var testController = new TestController(client);

        var result = testController.DoSomething(Guid.NewGuid().ToString()) as ViewResult;

以下是控制器的相关位:

        private ITestInterface _client { get; set; }

        public TestController(ITestInterface client)
        {
            _client = client;
        }

这是我的控制器操作的一部分:

 public ActionResult DoSomething(string id)
        {
            Guid token;
            if(!string.IsNullOrEmpty(id) && Guid.TryParse(id, out token))
            {
                using (var client = _client)
                {
                    ApplicationUser applicationUser;
                    var status = client.ValidateSomething(token);

                    switch (status)
                    {

客户端已正确模拟,但返回的“状态”属性始终是 ExampleEnum.DefaultValue 而不是我指定为结果的值。

我希望我已经提供了足够的信息。非常感谢任何帮助。

4

1 回答 1

0

你可能做错了设置。

Guid.NewGuid()返回一个新的随机 GUID,因此用于设置模拟的 GUID 和用于调用DoSomething方法的 GUID 永远不会相同。

您应该执行以下操作:

var guid = Guid.NewGuid()
...
Mock.Arrange(() => client.ValidateSomething(guid))
        .Returns(returnStatus).MustBeCalled();
...
var result = testController.DoSomething(guid.ToString()) as ViewResult;

使用相同的 GUID 进行模拟和调用DoSomething.


我不知道 JustMock,但使用 Moq,您也可以简单地使用它It.IsAny来匹配所有 GUID:

client.Setup(c => c.ValidateSomething(It.IsAny<Guid>())).Returns(returnStatus);
于 2014-06-25T14:33:07.300 回答