如何在 C# 中将复杂对象作为结构进行比较以进行单元测试

2024-03-24

我遇到了以下问题: 目前我正在使用 TDD 重构我的项目。有一个已存在的域,我无法更改。

代码示例:

public class Product: IEquatable<Product>
{
    public int Id { get; set; }
    public string Name { get; set; }

    public bool Equals(Product other)
    {
        if (other == null)
            return false;
        if (Id == other.Id && Name == other.Name)
            return true;
        return false;
    }
}


[TestClass]
public class ProductTest
{
    [TestMethod]
    public void Test1()
    {
        var product1 = new Product {Id = 100, Name = "iPhone"};
        var product2 = new Product {Id = 100, Name = "iPhone"};
        Assert.IsTrue(product1.Equals(product2));
    }
}

我的目标是找到一种快速解决方案来将复杂对象与结构进行比较,而不是实现 IEquatable 因为我无法扩展业务层。我的意思是像 Automapper 这样的东西,但不是为了映射,而是为了比较。请给一些建议。

预先感谢。


使用来自的代码here https://stackoverflow.com/questions/986572/hows-to-quick-check-if-data-transfer-two-objects-have-equal-properties-in-c/986617#986617 and here https://stackoverflow.com/questions/3060382/comparing-2-objects-and-retrive-a-list-of-fields-with-different-values/3060929#3060929:

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
}


public static class ProductTest
{
    public static void Main()
    {
        var product1 = new Product { Id = 100, Name = "iPhone" };
        var product2 = new Product { Id = 100, Name = "iPhone" };
        bool x = PropertyCompare.Equal(product1, product2); // true

        var deltas = PropertyComparer<Product>.GetDeltas(product1, product2);
        // ^^= an empty list
    }
}

改变第二个Name to "iPhone2" gives false以及包含单个条目的列表:"Name".

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 C# 中将复杂对象作为结构进行比较以进行单元测试 的相关文章

  • 如何模拟 typeorm 连接

    在集成测试中 我使用以下代码片段来创建连接 import Connection createConnection from typeorm ts ignore import options from ormconfig js export
  • 32 位 OpenFileDialog --> 64 位 System32?

    在 32 位程序中 如何让打开 保存文件对话框显示 64 位系统的 System32 文件夹中的文件 Wow64DisableWow64FsRedirection不起作用 因为由于某种原因它不适用于对话框 我猜是因为它位于不同的线程上 当然
  • 使用 WCF 的契约优先 SOA

    这个问题更多的是探索人们在社区中 在实际情况中所做的事情 而不是一个有针对性的问题 我对此进行了相当广泛的搜索 虽然我发现很多博主都提倡契约优先的服务设计 并且有一些评论支持它们 但我还没有找到很多关于使用 WCF 实现契约优先的实用信息
  • 使用 linq 2 实体检查 where 子句的两个条件

    嗨 我有一个名为 产品 的表 其中包含列 product id prodcut name prodcut price values like 1200 2000 3000 100 prodcut desc category id 1 2 3
  • 使用 testify 模拟接口方法两次,输入和输出不同

    如何在 golang 测试中模拟接口方法两次 例如 type myCache interface Get key string data interface error type service struct cache myCache f
  • 用于匹配字符的正则表达式,但当它包含在方括号中时则不匹配

    输入字符串 Wsg Fs A A A Cgbs Sg7 Wwg s Fs A A Afk Cgbs Sg7 所需的输出是一个字符串数组 Wsg Fs A A A Cgbs Sg7 Wwg s Fs A A Afk Cgbs Sg7 如果我将
  • 已删除的测试仍保留在 Xcode 测试导航器中

    我最近从我的项目中删除了一些旧的测试类并删除了这些文件 正如预期的那样 文件被移至垃圾箱并在 git 中显示为已删除 不幸的是 它们定义的测试类和测试用例继续出现在测试导航器中 我尝试过常见的方法 例如清理和重建 以及退出并重新打开 Xco
  • WPF - 检测鼠标按下一段时间

    检测鼠标按钮何时在特定元素上按住特定时间段的最佳方法是什么 感谢您的提示 我创建了一个附加属性以避免任何代码隐藏 using System using System Windows using System Windows Threadin
  • COM 互操作注册

    我有一个正在暴露的 NET 程序集COM http en wikipedia org wiki Component Object Model 该程序集有两个公共接口和一个公共类 当我构建程序集时 我收到此警告 AssemblyName dl
  • 如何将 OpenCV 的测试框架与 CMake 结合使用?

    好像 OpenCV 有一个测试框架 https github com Itseez opencv tree ef91d7e8830c36785f0b6fdbf2045da48413dd76 modules ts include opencv
  • 从 C# 检测 powerpoint 形状上的事件

    是否有可能检测在 Powerpoint 形状 例如箭头 上发生的事件 到目前为止 我发现唯一的可能性是 selectitemchanged beforerightclick 和 beforedoubleclick 但无法找到检测其他内容的方
  • 为什么自定义类型变量不保存值MVC

    我正在尝试使用 MVC 5 构建一个网站 我有一个包含 3 个变量的控制器类 public class WorkerController Controller public ViewModel viewModel new ViewModel
  • 使用 Minitest 测试自定义验证器

    我有多个带有电子邮件验证的模型 因此 我将验证提取到自定义验证器中 我按照以下教程做到了这一点导轨指南 http guides rubyonrails org active record validations html custom va
  • IL 的仿制药?

    是否可以在 IL 生成器中使用泛型 DynamicMethod method new DynamicMethod GetStuff typeof int new Type typeof object ILGenerator il metho
  • 正则表达式不等于字符串

    我用正则表达式用头撞墙 我正在尝试定义一个表达式 该表达式完全排除此文本 System 不区分大小写 但可以包含 系统 这个词提供的不仅仅是这个 例子 系统 无效 系统 无效 系统 无效 系统 无效 asd 系统 有效 asd 系统 asd
  • 分层架构中的异常处理

    我们正在分层设计中重构 当然还有重新设计 我们的服务 我们有服务操作层 BLL 网络抽象层 gt 处理网络代理 数据抽象层 但我们对我们的异常处理策略有点困惑 我们不想向外界透露太多 BLL 的信息 从其他层到bll就可以了 我们不想让 t
  • 运行 t4 脚本作为 resx 文件的自定义工具

    我有一个资源文件MyResource resx 我想改变MyResource Designer cs文件生成 我有一个 t4 脚本 它接受 resx 文件作为输入并给出结果转换 但是 我必须手动运行此 t4 才能使其工作 我看到 resx
  • DotNET 应用程序中的 GDI 句柄

    我的纯 DotNET 库作为非托管桌面应用程序中的插件运行 我收到了稳定的 虽然低 崩溃报告流 这些报告似乎表明 GDI 句柄存在问题 错误消息中的字体等 恢复为系统字体 各种控件的显示崩溃 不久后发生大规模崩溃 我的窗体几乎没有控件 但我
  • Java有没有类似微软CHESS的工具?

    是否有类似于 Microsoft 的现有 Java 工具CHESS http research microsoft com chess 或者 CHESS 源代码是否开放 以便我可以尝试将其转换为 Java 谷歌的织线工 http code
  • 如何在没有 Visual Studio 的情况下将新文件添加到 .csproj 文件

    如何添加新文件到 csproj从命令提示符 我认为没有任何工具可以响应命令行上的 add project 命令来执行此操作 但我认为您可以幸运地创建一个程序 脚本来直接操作 csproj 文件的 XML 内容 csproj 文件的结构如下所

随机推荐

  • 保持 OpenCV 2 和 OpenCV 3 之间的代码兼容性

    我的库当前使用 OpenCV 2 现在 我正在尝试编译该库以使用 OpenCV 3 似乎一些头文件被移动 一些常量被重命名 例如 CV INTER LINEAROpenCV 3 中未定义 由于我的库需要在 OpenCV 2 和 3 上编译和
  • AmazonRDSEnhancedMonitoringRole 的 Cloudformation 模板

    我正在尝试通过 Cloudformation 模板启动 RDS 堆栈 我想在我的数据库实例上启用增强监控 为了做到这一点 MonitoringRoleArn必须在资源上指定属性 据我了解 这个 ARN 应该指向一个 IAM 服务角色 该角色
  • python urllib2 urlopen 响应

    python urllib2 urlopen 响应
  • 在 eclipse RCP 中安装新插件/功能后,是否有任何方法可以自动从磁盘中清除旧插件/功能?

    我正在构建一个 RCP 应用程序 每个季度都会更新功能 插件 因此 如果用户选择自动更新功能 插件 则将下载更新插件的新 jar 但旧插件仍在使用我不再使用的磁盘空间 我厌倦了删除包含旧 jar 信息的安装历史记录 当我尝试删除它时 它向我
  • 我们什么时候应该使用 RxJS tap 运算符?

    我不明白从the docs https rxjs dev firebaseapp com api operators tap 有人能给我解释一下吗 大多数操作符都按流顺序工作 例如 source pipe map a string gt c
  • 如何将支持的操作系统添加到 Windows 单击一次应用程序清单中?

    我正在尝试将supportedOS标签添加到单击一次应用程序清单中 对于常规应用程序执行此操作的常用方法是将 app manifest 文件添加到包含supportedOS 标记的项目中 如下所示 我删除了自动生成的单击一次清单中已包含的所
  • 在 Swift 中将两字节 UInt8 数组转换为 UInt16

    使用 Swift 我想将 uint8 t 数组中的字节转换为整数 C 示例 char bytes 2 0x01 0x02 NSData data NSData dataWithBytes bytes length 2 NSLog data
  • Vue.js 从 webpack 包中排除文件夹

    我陷入了一个关于 webpack 的非常简单的问题 我有一个使用 vue cli 创建的简单 Vue js 应用程序 我创建了文件夹public Reports我想从捆绑包中排除它 该文件夹包含子文件夹和 PDF 我的项目结构是标准的 di
  • 从边框外部绝对定位

    当我将元素绝对定位在相对元素内时 坐标是从容器的边缘计算的 而不考虑边框 相当于从边框的内侧定位 除了从边框的外侧定位元素之外 还有什么方法可以定位元素吗 例如 如果我有一个没有边框的红色方块 如第一个 则文本会粘在容器的左上角 因为它有t
  • PHP PHAR 归档的优点

    PHP 5 3 有一个新功能称为PHAR如同JAR在JAVA中 它基本上是 PHP 文件的存档 它的优点是什么 我不明白它们在网络场景中有何帮助 除 易于部署 之外的任何其他用途 只需复制一个文件即可部署整个应用程序 开源项目有巨大的好处
  • 从 JavaScript 字符串中去除 U+10000-U+10FFFF

    Tried string replace u10000 u10FFFF g 但可悲的是 u不支持10000 要指定超出 U FFFF 的代码点 您需要查找UTF 16 代理对 https en wikipedia org wiki UTF
  • 放大黑线的阈值

    给定一张图像 如下图所示 我需要将其转换为二进制图像 仅限黑白像素 这听起来很简单 我尝试过两个阈值函数 问题是我无法使用这些函数中的任何一个来获得完美的边缘 任何帮助将不胜感激 我尝试过的过滤器是 RGB 和 HSV 空间中的欧几里得距离
  • 在 C++ 中写入相同值的竞争条件?

    当操作写入单个常量值时 代码中存在竞争条件是否存在任何问题 例如 如果有一个并行循环填充了seen另一个数组中的每个值的数组arr 假设索引越界没有问题 关键部分可能是以下代码 parallel body with index i int
  • mongodb查询嵌套结构

    如何查询此嵌套 json 结构以查找包含 A 的文档 categories id 12 values A B C id 17 values D E F 到目前为止 我只能通过以下方式获取 id 值 db coll find categori
  • 有没有办法专注于 Angular 4/Ionic 3 上动态创建的表单?

    I have a page with dynamically created forms like this The blank spaces are inputs and the entire row is a button Is the
  • 如何在H2中创建新数据库?

    我有一个在 MySQL 上本地运行的站点 我想在 H2 数据库上运行它 我刚刚在浏览器上运行了控制台的 h2 jar 文件 但每当我登录时我都会看到该列表jdbc h2 var www mysite data db MODE MySQL i
  • Kubernetes 上的 Npgsql 和 Pgbouncer - 池化和 keepalives

    我正在寻找更详细的指导 其他人在 Pgbouncer 的生产中使用 Npgsql 的经验 基本上 我们使用 GKE 和 Google Cloud SQL 进行了以下设置 现在 我已经使用本地连接池配置了 npgsql 就好像 pgbounc
  • 如何使用 CSS 并排浮动 3 个 div?

    我知道如何让 2 个 div 并排浮动 只需将一个向左浮动 另一个向右浮动即可 但是如何使用 3 个 div 来做到这一点 或者我应该仅使用表格来实现此目的 只需给它们一个宽度并float left 这是一个例子 div style wid
  • 有没有办法限制ggplot2中的vline长度

    我试图使用 ggplot vline 和 hline 在线图上显示截距 但希望线条在图上的截距点处停止 在 ggplot 中这可能吗还是有其他解决方案 library ggplot2 pshare lt data frame for i i
  • 如何在 C# 中将复杂对象作为结构进行比较以进行单元测试

    我遇到了以下问题 目前我正在使用 TDD 重构我的项目 有一个已存在的域 我无法更改 代码示例 public class Product IEquatable