Как смоделировать коллекцию MongoDB типа IMongoCollection <T>, чтобы вернуть некоторые предопределенные данные? - PullRequest
0 голосов
/ 05 апреля 2019

Ниже мой код:

Контроллер / Действие:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Register(CustomerViewModel model, string returnUrl = null)
{
    try
    {
        ViewData["ReturnUrl"] = returnUrl;

        // when debugging the test, _dbContext.Customers throws exception
        CustomerDoc existingCustomer = await _dbContext.Customers.Find(o => o.email == model.email).FirstOrDefaultAsync();
        if (existingCustomer != null)
        {
            ModelState.AddModelError("Email", "email already used.");
        }
        // other checkings 

        if (!ModelState.IsValid)
        {
            return View(model);
        }

        // if model state is valid, do something here
    }
    catch (Exception ex)
    {
        return View(model);
    }

    return View(model);
}  

И мой код модульного теста:

[Fact]
public async Task should_return_view_with_errors_when_email_already_exists()
{
    IEnumerable<CustomerDoc> customers = new List<CustomerDoc>
    {
        new CustomerDoc
        {
            email = "test@test.com"
        }
    };

    _dbContextMock.SetupAllProperties();

    // below line is causing the error
    _dbContextMock.Setup(c => c.Customers).Returns(() =>(IMongoCollection<CustomerDoc>)customers);

    CustomerViewModel model = new CustomerViewModel
    {
        email = "test@test.com"
    };

    CreateController();

    var result = await _controller.Register(model);

    Assert.IsType<ViewResult>(result);
    Assert.False(_controller.ModelState.IsValid);
    Assert.True(_controller.ModelState.ContainsKey("Email"));
}

Как вы можете видеть в моем комментарии кода модульного теста, я пытаюсь смоделировать коллекцию IMongoCollection, чтобы вернуть некоторые данные.Но я не могу этого сделать, потому что _dbContext.Customers вызывает исключение.

Как я могу издеваться IMongoCollection , чтобы вернуть некоторые предопределенные данные?

Я использую
asp.net core 2.1.0
Mongodb Driver 2.7.0

1 Ответ

0 голосов
/ 05 апреля 2019

Вы объявляете customers как List:

IEnumerable<CustomerDoc> customers = new List<CustomerDoc>

, но затем пытаетесь привести его к IMongoCollection

() =>(IMongoCollection<CustomerDoc>)customers

Есть два непосредственных направления (но оба имеютдругие вопросы, с которыми нужно разобраться):

1) Просто верните список без приведения

() => customers

, но я не вижу тип c.Customers, поэтому я подозреваю, что он просто переместитсяпроблема.Я предполагаю, что это IMongoCollection<CustomerDoc>, поэтому вы пытаетесь вначале сыграть актерский состав?Это проблематично, поскольку .Returns необходимо связать с функцией, выполняющей эквивалент c.Customer.Find().Тем не менее, это, вероятно, лучше, чем альтернатива.

2) Изменение переменной customers на тип, который реализует IMongoCollection.

Опция 1, похоже на путь, как вариант 2вынуждает вас начинать работать с большим количеством логики, которая на самом деле не должна относиться к этому коду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...