.net core 2 和 DI 中用于测试 DAL 的 xUnit - 有点混乱
xUnit for test DAL in .net core 2 and DI- a little bit of confusion
我对用于测试我的 DAL 的 xUnit 有点困惑。
我的目标是验证我的 DAL 是否正确访问数据库并提取正确的数据。
我创建了一个 xUnit 测试项目并尝试像这样使用 Moq 进行简单测试
[Fact]
public void Test1()
{
// Arrange
var mockMyClass = new Mock<IMyClassBLL>();
// Setup a mock stat repository to return some fake data within our target method
mockStAverageCost.Setup(ac => ac.GetBy(It.IsAny<MyClassVO>())).Returns(new List<MyClassVO>
{
new MyClassVO { HCO_ID = "1"},
new MyClassVO { HCO_ID = "2"},
new MyClassVO { HCO_ID = "3"},
new MyClassVO { HCO_ID = "4"}
});
// create our MyTest by injecting our mock repository
var MyTest = new MyClassBLL(mockMyClass.Object);
// ACT - call our method under test
var result = MyTest.GetBy();
// ASSERT - we got the result we expected - our fake data has 6 goals we should get this back from the method
Assert.True(result.Count == 4);
}
上面的方法没问题。
现在我想直接访问数据库以获取数据。
显然有些事情逃避了我,我不明白如何使用 .net core 2 模拟依赖注入和访问数据来执行数据测试。
有人可以阐明我的想法吗?
您是在寻找单元测试还是集成测试?它们是根本不同的东西,服务于不同的目的。
如果您的目标是确保 GetBy
(被测功能单元)执行预期的操作,那么您应该不使用实时数据.与真实数据的真实联系会引入变量,导致测试可能会失败,而实际上 GetBy
没有任何问题。对于真正的单元测试,您应该只使用模拟和测试数据。
如果您的目标是确保您的应用程序可以连接到您的数据库并实际从中提取数据,那么这就是集成测试。通常,您可能会在测试中使用 GetBy
/您的存储库,但通常您希望避免这种情况。同样,通过 ADO.NET 之类的东西直接连接和查询用于删除变量,因此如果测试失败,您将知道这是因为通常确实存在问题 connecting/querying,而不仅仅是您的存储库或其特定方法存在一些问题。
总而言之,一个好的测试只测试一件事情。如果那个特定的东西需要外部组件(例如 SQL 服务器数据库),那么它就是一个集成测试,此时,您正在测试组件的集成。存储库方法之类的东西不应该发挥作用,因为那会在一次测试中测试 两个 不同的东西。如果您需要测试 GetBy
那么应该没有外部依赖项,例如 SQL 服务器数据库。
此外:
I did not understand how to perform a data test with .net core 2 simulating dependeny injection and accessing the data.
这将是测试框架的示例,这是另一个 no-no。您可以安全地假设 DI 在 ASP.NET Core 中工作。它有自己的测试套件。您也不需要为此添加测试。
我对用于测试我的 DAL 的 xUnit 有点困惑。
我的目标是验证我的 DAL 是否正确访问数据库并提取正确的数据。
我创建了一个 xUnit 测试项目并尝试像这样使用 Moq 进行简单测试
[Fact]
public void Test1()
{
// Arrange
var mockMyClass = new Mock<IMyClassBLL>();
// Setup a mock stat repository to return some fake data within our target method
mockStAverageCost.Setup(ac => ac.GetBy(It.IsAny<MyClassVO>())).Returns(new List<MyClassVO>
{
new MyClassVO { HCO_ID = "1"},
new MyClassVO { HCO_ID = "2"},
new MyClassVO { HCO_ID = "3"},
new MyClassVO { HCO_ID = "4"}
});
// create our MyTest by injecting our mock repository
var MyTest = new MyClassBLL(mockMyClass.Object);
// ACT - call our method under test
var result = MyTest.GetBy();
// ASSERT - we got the result we expected - our fake data has 6 goals we should get this back from the method
Assert.True(result.Count == 4);
}
上面的方法没问题。
现在我想直接访问数据库以获取数据。
显然有些事情逃避了我,我不明白如何使用 .net core 2 模拟依赖注入和访问数据来执行数据测试。
有人可以阐明我的想法吗?
您是在寻找单元测试还是集成测试?它们是根本不同的东西,服务于不同的目的。
如果您的目标是确保 GetBy
(被测功能单元)执行预期的操作,那么您应该不使用实时数据.与真实数据的真实联系会引入变量,导致测试可能会失败,而实际上 GetBy
没有任何问题。对于真正的单元测试,您应该只使用模拟和测试数据。
如果您的目标是确保您的应用程序可以连接到您的数据库并实际从中提取数据,那么这就是集成测试。通常,您可能会在测试中使用 GetBy
/您的存储库,但通常您希望避免这种情况。同样,通过 ADO.NET 之类的东西直接连接和查询用于删除变量,因此如果测试失败,您将知道这是因为通常确实存在问题 connecting/querying,而不仅仅是您的存储库或其特定方法存在一些问题。
总而言之,一个好的测试只测试一件事情。如果那个特定的东西需要外部组件(例如 SQL 服务器数据库),那么它就是一个集成测试,此时,您正在测试组件的集成。存储库方法之类的东西不应该发挥作用,因为那会在一次测试中测试 两个 不同的东西。如果您需要测试 GetBy
那么应该没有外部依赖项,例如 SQL 服务器数据库。
此外:
I did not understand how to perform a data test with .net core 2 simulating dependeny injection and accessing the data.
这将是测试框架的示例,这是另一个 no-no。您可以安全地假设 DI 在 ASP.NET Core 中工作。它有自己的测试套件。您也不需要为此添加测试。