以下是我的应用程序中的确切场景:
任何人都可以请建议如何实现相同的目标?
对此的任何帮助将不胜感激。
谢谢
我上移了最后一段,因为它出现在您的XY 问题的 X 上。我确实建议阅读所有其他段落,因为您似乎误解了单元测试是什么以及它的用途是什么。
我刚刚在你写的评论中注意到了这一点:
因此,如果一个项目的开发人员更改了数据库架构,我们希望提醒他们这种架构更改也应反映在其他项目中。
单元测试不应用作同步两个完全不相关的代码库的方法。
这是 DRY 与 WET 的简单应用程序:如果这些应用程序共享相同的数据库架构,则数据库架构(和相关的 EF 实体)应该位于两个应用程序都依赖的单一来源中。
不要开发相同的东西两次,因为当另一个改变时,你最终不得不不断地同步一个(这就是你现在正在处理的)。
例如,您可以在 Nuget 服务器上托管“共享数据”项目,并使两个应用程序都引用自托管的 Nuget 包。正确配置后,无论何时构建应用程序,它都会获取“共享数据”项目的最新版本,从而确保两个应用程序始终使用最新版本的数据库模式。
第二种方法(如果您不想创建共享依赖项)是让您的颠覆系统观察某些文件(例如实体类文件夹),并在这些文件中进行任何更改时提醒您。当您收到警报时,您将注意检查此更改是否影响其他应用程序的代码库。
如果我理解正确的话,你真的只是想得到一个警报,对吧?
还有其他方法可以解决这个问题,决定取决于您的基础设施和您的团队使用的技术。但是绝对不应该通过手动编写脚本/伪造单元测试失败来完成。
当数据库架构和实体更改时,我希望某些单元测试失败
单元测试测试一件事(因此是“单元”)。看起来您正在编写测试两件事的测试:业务逻辑和数据库。这是一个集成测试。作为一个经验法则:
如果您要专门为 EF 编写单元测试(您不应该这样做,但稍后会详细介绍),您实际上不会在测试中涉及实际的数据库。充其量,您会断言 EF 生成的 SQL,而不在数据库上运行该查询。
重复我的观点,单元测试测试一个组件。实体框架和数据库服务器是两个不同的东西。
使用外部组件(例如数据库服务器)时,您又要深入到集成测试领域。
如前所述,您不应该测试实体框架。对库进行单元测试基本上是在做库开发人员的工作。你不应该为图书馆的工作方式而烦恼。如果有的话,您使用的是专库,因为你并不想知道它是如何工作的内部。
考虑这个测试:
public void TestForAddition()
{
var expectedValue = 2;
var testValue = 1 + 1;
Assert.AreEqual(testValue,expectedValue);
}
您在这里所做的是测试+
由 C#.Net 框架提供的运算符。那不是您代码的一部分,因此您不应该测试它。这个想法与 EF 参数相同:它不是您的代码,也不由您来测试。您必须信任您使用的依赖项。
但是,如果您重载了+
运算符,则应该对其进行测试(因为这是您的代码)
public static Person operator+ (Person a, Person b)
{
return new Person() { Name = a.Name + " " + b.Name };
}
public void TestForPersonAddition()
{
var expectedValue = "Billie Jean";
var billie = new Person() { Name = "Billie" };
var jean = new Person() { Name = "Jean" };
Assert.AreEqual(billie + jean,expectedValue);
}
对于以 EF 为中心的示例,这意味着您不应该对 Entity Framework 进行单元测试。您应该只对代码进行单元测试,而不应该对 EF 进行单元测试。
但是,您可以为此编写集成测试。这可以实现您想要的:您针对现有数据库运行集成测试。如果集成测试通过,您就会知道新代码库与现有数据库兼容。如果他们不这样做,那么您就知道发生了值得开发人员注意的问题。
但是,我希望在更改数据库架构和实体时某些单元测试失败,但不更改单元测试。这意味着,我希望开发人员在更改数据库架构和实体时修复单元测试。
因此,您希望您的开发人员首先修复从未被破坏的单元测试吗?
你的意图对我来说毫无意义。您更改了一些代码并且单元测试没有失败。这是一件好事。但是你想使他们失败了,所以你的开发者则被迫“修复”单元测试(即未在首位打破)。
如果单元测试通过,但您仍然声称应用程序的行为有问题,那么您的单元测试没有完成它们应该做的工作。
你在滥用单元测试。问题不是试图弄清楚如何强制单元测试失败;问题是您期望单元测试的结果告诉您什么。
不应使用单元测试来测试内部系统是否已更改。单元测试测试应用程序是否仍然以相同的方式运行(即使某些代码已更改)。
如果我从头开始重写您的代码库,然后在我的新代码库上运行相同的(未修改的)单元测试,并且所有单元测试都通过了,这意味着我的代码的行为方式与您的相同,并且我们的代码库在功能上是等效的(至少关于您为其编写测试的行为)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句