gpt4 book ai didi

c# - 如何为依赖于 DbEntityEntry 的对象创建单元测试

转载 作者:可可西里 更新时间:2023-11-01 08:13:33 25 4
gpt4 key购买 nike

我有以下辅助方法,它从 DbEntityValidationException 中提取验证消息。我们需要这个,因为默认情况下验证的细节不会添加到异常中。

public static string LogMessageDbEntityValidationException(DbEntityValidationException ex)
{
StringBuilder error = new StringBuilder();

error.AppendLine("Validation Error details for DbEntityValidationException throw: ");

foreach (var validationErrors in ex.EntityValidationErrors)
{
foreach (var validationError in validationErrors.ValidationErrors)
{
error.AppendLine(string.Format("Property: {0} , Error: {1}",
validationError.PropertyName, validationError.ErrorMessage));
}
}

return error.ToString();
}

我在尝试创建单元测试时遇到了问题,特别是我无法创建 DbEntityValidationResult,因为它需要一个没有公共(public)构造函数的 DbEntityEntry 实例。

这里是损坏的单元测试,它在创建 DbEntityEntry 时失败:

public void LogMessageDbEntityValidationExceptionTest()
{
string errorMessage = "Unit Test Error Message";
string expected = "Not valid data.";
List<DbEntityValidationResult> entityValidationResults = new List<DbEntityValidationResult>();
List<DbValidationError> errorList = new List<DbValidationError>();
DbEntityValidationException ex;

errorList.Add(new DbValidationError("TestProperty", expected));

entityValidationResults.Add(new DbEntityValidationResult(new System.Data.Entity.Infrastructure.DbEntityEntry(), errorList));

ex = new DbEntityValidationException(errorMessage, entityValidationResults);
string actual = Common.LogMessageDbEntityValidationException(ex);

Assert.IsTrue(actual.Contains(expected));
}

注意,DbEntityEntry 没有实现接口(interface),所以我不能使用模拟/伪造。

最佳答案

一些模拟框架(如 Moq)执行方法重定向,允许您模拟没有接口(interface)的类。做它类似于 http://www.codenutz.com/unit-testing-mocking-base-class-methods-with-moq/

话虽如此,这并不是一个好的编程习惯,因为您将使您的测试代码永远依赖于该框架,并且您会失去一些单元测试的设计优势。

你可以做的是编写一个代理类来包装你的不可测试对象并在其上添加一个接口(interface),然后你每次使用普通类时都使用代理类。

关于c# - 如何为依赖于 DbEntityEntry 的对象创建单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26613299/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com