ExecuteSqlCommand насмешливого EF с использованием NUnit - PullRequest
3 голосов
/ 02 марта 2020

Я использую ядро ​​Entity Framework. Я имел в виду один из предложенных здесь кодов: { ссылка }

public void SaveOrUpdate(MyEntity entity)
{
    var sql =  @"MERGE INTO MyEntity
                USING 
                (
                   SELECT   @id as Id
                            @myField AS MyField
                ) AS entity
                ON  MyEntity.Id = entity.Id
                WHEN MATCHED THEN
                    UPDATE 
                    SET     Id = @id
                            MyField = @myField
                WHEN NOT MATCHED THEN
                    INSERT (Id, MyField)
                    VALUES (@Id, @myField);"

    object[] parameters = {
        new SqlParameter("@id", entity.Id),
        new SqlParameter("@myField", entity.myField)
    };
    context.Database.ExecuteSqlCommand(sql, parameters);
}

Мне нужно смоделировать ExecuteSqlCommand, но этот метод расширения не может быть переопределен установкой Moq. Я не хочу издеваться над всем методом SaveOrUpdate. Пожалуйста, предложите, если есть какой-нибудь способ смоделировать или настроить его для модульного тестирования с использованием любых методов контекста базы данных. Я использую UseInMemoryDatabase для контекста базы данных модульного тестирования.

Ответы [ 2 ]

2 голосов
/ 02 марта 2020

Вам нужно будет смоделировать ваш метод, а не реализацию ядра EF. Вы можете сделать свой метод виртуальным и смоделировать его реализацию с помощью Moq:

public virtual void SaveOrUpdate(MyEntity entity)
{
    var sql =  @"MERGE INTO MyEntity
                USING 
                (
                   SELECT   @id as Id
                            @myField AS MyField
                ) AS entity
                ON  MyEntity.Id = entity.Id
                WHEN MATCHED THEN
                    UPDATE 
                    SET     Id = @id
                            MyField = @myField
                WHEN NOT MATCHED THEN
                    INSERT (Id, MyField)
                    VALUES (@Id, @myField);"

    object[] parameters = {
        new SqlParameter("@id", entity.Id),
        new SqlParameter("@myField", entity.myField)
    };
    context.Database.ExecuteSqlCommand(sql, parameters);
}

, а затем смоделировать реализацию этого метода.

Посмотрите следующие сообщения:

https://entityframework.net/knowledge-base/26014969/how-to-moq-entity-framework-sqlquery-calls

Как Moq Entity Framework вызывает SqlQuery

0 голосов
/ 02 марта 2020

Мне действительно нравится предложение здесь: Moq Entity Frameworks ExecuteSQLCommand . На самом деле это не издевательство над всей функцией, а ExecuteSqlCommand, добавив оболочку в вашем контексте:

Итак, в вашем классе контекста

public class MyContext : DbContext
{
    public virtual int ExecuteSqlCommand(string sql, params object[] parameters)
    {
        return Database.ExecuteSqlCommand(sql, parameters);
    }
    public virtual int ExecuteSqlCommand(TransactionalBehavior transactionalBehavior, string sql, params object[] parameters)
    {
        return Database.ExecuteSqlCommand(transactionalBehavior, sql, parameters);
    }

    // The rest of the implementation

Так что теперь вы можете смоделировать контекст, и так как функции являются vitrual, вы можете издеваться над ними тоже. Вам нужно всего лишь изменить свой код следующим образом:

public void SaveOrUpdate(MyEntity entity)
{
    var sql =  @"MERGE INTO MyEntity
                USING 
                (
                   SELECT   @id as Id
                            @myField AS MyField
                ) AS entity
                ON  MyEntity.Id = entity.Id
                WHEN MATCHED THEN
                    UPDATE 
                    SET     Id = @id
                            MyField = @myField
                WHEN NOT MATCHED THEN
                    INSERT (Id, MyField)
                    VALUES (@Id, @myField);"

    object[] parameters = {
        new SqlParameter("@id", entity.Id),
        new SqlParameter("@myField", entity.myField)
    };
    context.ExecuteSqlCommand(sql, parameters);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...