Вставить / обновить / выбрать с помощью MSTest в Visual Studio. Почему мой тест выбора возвращает исходную вставленную запись после запуска теста обновления? - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть тестовый проект в Visual Studio 2019, тестирующий C# код для вставки / обновления / выбора данных с использованием SQL Тестовой базы данных сервера.

  1. Я вставляю запись
  2. Я извлекаю новую запись, чтобы убедиться, что она есть, проверив, что мой результат не равен нулю и что данные совпадают с тем, что я вставил.
  3. Я обновляю эту запись, изменяя некоторые значения (я вижу, что обновление происходит успешно самостоятельно, просматривая базу данных в SQL Server Management Studio).
  4. Я снова получаю ту же запись, но моя проверка измененных данных не удалась, поскольку возвращаемая мной запись - это исходные вставленные данные, а не обновленные данные.

Что происходит? При нормальных условиях в моем приложении, если я получаю некоторые данные, которые я только что обновил, он возвращает правильные данные. Только в этом тестовом сценарии я получаю старые данные.

Вот код теста:

[TestMethod]
public void CRUDTest()
{
     using (DefaultContext db = new DefaultContext())
     {
          int TestID = 1;
          MyData.Create(db, TestID, "test1");

          MyData resultFetch = MyData.Fetch(db, TestID);
          Assert.IsNotNull(resultFetch);
          Assert.AreEqual("test1", resultFetch.Name);
          resultFetch = null;

          MyData.Update(db, TestID, "updateTest1");

          resultFetch = MyData.Fetch(db, TestID);
          Assert.IsNotNull(resultFetch);
          Assert.AreEqual("updateTest1", resultFetch.Name); // THIS TEST FAILS
          resultFetch = null;
     }
}

Тест не пройден для этого последнего утверждения. Значение resultFetch.Name по-прежнему является исходным значением «test1». Вот методы, которые тестируются:

public static bool Create(DefaultContext db, int Id, string Name)
{
     Dictionary<string, object> dict = new Dictionary<string, object>();
     dict.Add("Id", new KeyValuePair<string, object>("int", Id));
     dict.Add("Name", new KeyValuePair<string, object>("string", Name));

     DbParameter[] parameters = new GetParameterMapper().GetParameters(dict, true);

     int result = db.Database.ExecuteSqlCommand(@"
          INSERT
            INTO MyData (
                [Id]
                ,[Name]
            )
            VALUES(
                @Id
                ,@Name 
            );

            SET @IDENTITY = SCOPE_IDENTITY();
            SET @ROWCOUNT = @@ROWCOUNT;", parameters);

     if (result > 0)
     {
          return true;
     }
     else
     {
          throw new Exception("Error: The record was not inserted in the database.");
     }
}

public static bool Update(DefaultContext db, int ID, string Name)
{
     Dictionary<string, object> dict = new Dictionary<string, object>();
     dict.Add("Id", new KeyValuePair<string, object>("int", Id));
     dict.Add("Name", new KeyValuePair<string, object>("string", Name));

     int result = db.Database.ExecuteSqlCommand(@"
          UPDATE
            MyData
            SET[Name] = CASE WHEN @Name IS NOT NULL THEN @Name ELSE [Name] END 
          WHERE [Id] = @Id
        ", new GetParameterMapper().GetParameters(dict));

     if (result > 0)
     {
          return true;
     }
     else
     {
          throw new Exception("Error: The record was not updated in the database.");
     }
}

public static MyData Fetch(DefaultContext db, int Id)
{
     Dictionary<string, object> dict = new Dictionary<string, object>();
     dict.Add("Id", new KeyValuePair<string, object>("int", Id));

     var obj = db.MyData.FromSql<MyData>(@"
          SELECT[Id]
            ,[Name]
          FROM MyData
          WHERE [Id] = @Id
        ", new GetParameterMapper().GetParameters(dict));
     return obj.FirstOrDefault();
}
...