【发布时间】: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