【问题标题】:Mock function is returning null value, instead of giving mock value模拟函数返回空值,而不是给出模拟值
【发布时间】:2021-10-22 20:15:37
【问题描述】:

我想在下面的函数上写测试用例

public async Task<List<Author>> GetAuthor()
            {
                using IDbConnection db = GetDbconnection();
    
                var result = await Task.FromResult(dapperWrapper.GetAll<Author>(db, $"SELECT TOP (10) liAuthorId as Id, sFirstName as FirstName, sLastName as LastName from dbo.Authors", null, commandType: CommandType.Text));
                return result;
            }

我试图在 GetAuthor 方法中模拟 GetAll 方法并传递模拟值以返回该函数,但是当我尝试运行测试方法 GetAuthor 时,GetAll 方法给出空值,尽管给出了给出的模拟值返回函数。

 public async Task TestMethodTestAsync()
        {

            var expectedConnectionString = "url";
            using IDbConnection db = new SqlConnection(expectedConnectionString);
            var expectedQuery = $"SELECT TOP (10) liAuthorId as Id, sFirstName as FirstName, sLastName as LastName from dbo.Authors";
            List<Author> author = 
                new List<Author> {
                new Author { Id = 1, FirstName = "abc", LastName = "def" },
                new Author { Id = 1, FirstName = "abc", LastName = "def" },
                new Author { Id = 1, FirstName = "abc", LastName = "def" },
                new Author { Id = 1, FirstName = "abc", LastName = "def" },
                new Author { Id = 1, FirstName = "abc", LastName = "def" },
                new Author { Id = 1, FirstName = "abc", LastName = "def" },
                new Author { Id = 1, FirstName = "abc", LastName = "def" },
                new Author { Id = 1, FirstName = "abc", LastName = "def" },
                new Author { Id = 1, FirstName = "abc", LastName = "def" },
                new Author { Id = 1, FirstName = "abc", LastName = "def" }
               };

            mockDapperWrapper.Setup(x => x.GetAll<Author>(db, expectedQuery, null, CommandType.Text)).Returns(author);

            var result = newsRepository.GetAuthor();

作者模型

  public class Author : BaseModel
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
}

因为我刚开始学习 C# 和新手,如果我做错了,请告诉我。

我想在下面的函数上写测试用例

public async Task<List<NewsArticle>> GetNewsArticle()
    {
        // Create SQL Connection
        using IDbConnection db = GetDbconnection();

        // Create Dapper dynamic parameter set
        DynamicParameters parameter = new DynamicParameters();

        // Output Paramaters
        parameter.Add("@ReturnValue", dbType: DbType.Int32, direction: ParameterDirection.Output);
        parameter.Add("@Message", dbType: DbType.String, direction: ParameterDirection.Output, size: 400);

        var result = await Task.FromResult(dapperWrapper.GetAll<NewsArticle>(db, $"[KafkaPublisher].[GetNewsArticle]", parameter, commandType: CommandType.StoredProcedure));
        
        return result;
    }

我试图在 GetNewsArticle 方法中模拟 GetAll 方法并传递模拟值以返回该函数,但是当我尝试运行测试方法 GetNewsArticle 时,GetAll 方法给出空值,尽管给出了给出的模拟值返回函数。

 public async Task Should_Fetch_NewsArticle_Data()
    {

        DynamicParameters parameter = new DynamicParameters();

        // Output Paramaters
        parameter.Add("@ReturnValue", dbType: DbType.Int32, direction: ParameterDirection.Output);
        parameter.Add("@Message", dbType: DbType.String, direction: ParameterDirection.Output, size: 400);
        string expectedQuery = "[KafkaPublisher].[GetNewsArticle]";

        List<NewsArticle> article =
            new List<NewsArticle> {
            new NewsArticle { Timestamp = 1, Version = 1, Headline = "hl", Body = "b1", AuthorId = 1 },
            new NewsArticle { Timestamp = 1, Version = 1, Headline = "hl", Body = "b1", AuthorId = 1 },
            new NewsArticle { Timestamp = 1, Version = 1, Headline = "hl", Body = "b1", AuthorId = 1 },
            new NewsArticle { Timestamp = 1, Version = 1, Headline = "hl", Body = "b1", AuthorId = 1 },
            new NewsArticle { Timestamp = 1, Version = 1, Headline = "hl", Body = "b1", AuthorId = 1 },
            new NewsArticle { Timestamp = 1, Version = 1, Headline = "hl", Body = "b1", AuthorId = 1 },
            new NewsArticle { Timestamp = 1, Version = 1, Headline = "hl", Body = "b1", AuthorId = 1 },
            new NewsArticle { Timestamp = 1, Version = 1, Headline = "hl", Body = "b1", AuthorId = 1 },
            new NewsArticle { Timestamp = 1, Version = 1, Headline = "hl", Body = "b1", AuthorId = 1 },
            new NewsArticle { Timestamp = 1, Version = 1, Headline = "hl", Body = "b1", AuthorId = 1

            };

        mockDapperWrapper.Setup(x => x.GetAll<NewsArticle>(It.IsAny<IDbConnection>(), expectedQuery, null, CommandType.Text)).Returns(article);

        var result = await newsRepository.GetNewsArticle();
        

【问题讨论】:

  • 在这个低级别模拟数据库通常是个坏主意。要么使用真实的数据库进行集成测试(如 LocalDB 实例),要么将数据库访问抽象一点,以便您可以模拟返回域对象的方法(换句话说,模拟 GetAuthor 本身,而不是其实现)。像GetAuthor 这样的东西通常不值得单独测试,因为它微不足道;测试永远不会反映比方法的实现更多或更少的任何东西,并且两者都必须同步更改,这消除了测试的有用性。期待一个特定的查询是一个不好的迹象。

标签: c# unit-testing asynchronous moq


【解决方案1】:

只有当所有参数都匹配时,Mock 才会返回配置值。传递给模拟设置的db 值与GetAuthor 中创建的值不同。使用 It.IsAny&lt;IDbConnection&gt;() 进行模拟设置以匹配此类型的任何参数。

【讨论】:

  • Thanku Artur,它的工作原理和一件事我想在存储过程的情况下了解更多,它是如何工作的。我已经用调用存储过程的方法更新了这个问题。请帮助我
  • 阅读@JeroenMonstert 评论。不要嘲笑你的数据库,它没用。在单元测试中模拟您的 DAL,并针对真实数据库执行集成测试以测试您的 DAL
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2020-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多