【发布时间】:2020-05-25 09:23:54
【问题描述】:
我正在尝试使用 XUnit 在我的 Web API 中对我的控制器内的方法进行单元测试。该方法的作用是从数据库中获取一个按 ISBN 的书名。我在单元测试期间遇到的问题是我不确定如何插入我必须执行测试的虚拟数据,以及 Assert 函数的工作原理。
TitleController.cs
[ApiController]
[Route("titlecontroller")]
public class TitleController : Controller
{
private IGtlTitleRepository _gtlTitleRepository;
public TitleController(IGtlTitleRepository gtlTitleRepository)
{
_gtlTitleRepository = gtlTitleRepository;
}
[Route("getTitle/{ISBN}")]
[HttpGet()]
public GtlTitle GetTitle(string ISBN)
{
return _gtlTitleRepository.GetTitle(ISBN);
}
}
IGtlTitleRepository.cs
public interface IGtlTitleRepository
{
GtlTitle GetTitle(string ISBN);
}
MockGtlTitleRepository.cs
public class MockGtlTitleRepository : IGtlTitleRepository
{
private readonly string _connection;
public MockGtlTitleRepository(IOptions<ConnectionStringList> connectionStrings)
{
_connection = connectionStrings.Value.GTLDatabase;
}
private List<GtlTitle> _titleList;
public GtlTitle GetTitle(string ISBN)
{
using (var connection = new SqlConnection(_connection))
{
connection.Open();
return connection.QuerySingle<GtlTitle>("GetTitleByISBN", new { ISBN }, commandType: CommandType.StoredProcedure);
}
}
}
对,至于我的测试代码,我可以写下面的代码,但是正如我上面所说的,我想不出一个合适的方法来测试这个方法。
public class UnitTest1
{
[Fact]
public void Test1()
{
var repositoryMock = new Mock<IGtlTitleRepository>();
var title = new GtlTitle();
repositoryMock.Setup(r => r.GetTitle("978-0-10074-5")).Returns(title);
var controller = new TitleController(repositoryMock.Object);
var result = controller.GetTitle("978-0-10074-5");
// assert??
repositoryMock.VerifyAll();
}
}
在这个单元测试中应该做什么才能正确地测试方法?
编辑:
GtlTitle.cs
public class GtlTitle
{
public string ISBN { get; set; }
public string VolumeName { get; set; }
public string TitleDescription { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string PublisherName { get; set; }
}
【问题讨论】:
-
你能告诉我们
GtlTitle类吗? -
我用它编辑了原帖!
-
只需检查控制器的结果是否等于标题
Assert.Equal(title, result);? -
看看这个帖子:exceptionnotfound.net/… ...应该对你有用
-
@PavelAnikhouski 谢谢!那行代码有效,但是……是这样吗?我假设
repositoryMock.Setup(r => r.GetTitle("978-0-10074-5")).Returns(title);这行基本上模拟了一个数据库对象?
标签: c# unit-testing xunit webapi