- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我尝试使用以下结构(简化)模拟一些接口(interface):
interface A
{
DateTime DateCreated { get; set; }
}
interface B : A
{
DateTime DateCreated { get; set; }
}
我遇到的问题是 DateCreated 是每个接口(interface)的单独属性,因此即使我知道的具体对象只有这些共享属性的一个共享实现,调用 Mock.SetupAllProperties 也会为每个对象提供一个单独实现。这意味着它们不共享值,因此在访问 ((A)obj).DateCreated 时调用 ((B)obj).DateCreated = {blah} 不会在其他地方给出所需的结果。
我认为在 Moq 中解决此问题的唯一方法是执行以下操作:
var m = new Mock<B>();
DateTime closure;
m.SetupGet(x => x.DateCreated).Returns(() => closure);
m.SetupSet(x => x.DateCreated).Callback(value => { closure = value; });
m.As<A>.SetupGet(x => x.DateCreated).Returns(() => closure);
m.As<A>.SetupSet(x => x.DateCreated).Callback(value => { closure = value; });
这很乏味,容易出错,我需要为至少十二个属性执行此操作,我不知道还有多少。我可能可以编写一个通用方法来执行此操作,但似乎必须有一个更简单的解决方案。谁能建议更好的方法来做到这一点?
(我很想“更正”接口(interface)的定义,但这段代码是我们整个组织共享的公共(public)遗留代码。由于这是一个潜在的破坏性变化,我不能随心所欲地进行修改-妮莉。)
编辑:澄清一下,我想要的是一种能够用 Moq 完成与此等效的简单方法:
class C : B
{
public DateTime DateCreated { get; set; }
}
因为 B 和 A 都有一个名称和类型都相同的属性,所以这个属性同时服务于他们两个。似乎因为在实际代码中有一种简单的方法可以做到这一点,所以应该有一种同样简单的方法来使用 Moq 来做到这一点。
最佳答案
在重新阅读您的问题后(我一定没有清醒),我意识到我完全没有理解您的观点。我没有看到一种简单的方法来做你想做的事,但如果你想过着危险的生活,你可以通过仅设置基本接口(interface)的属性来滥用我在下面提到的错误:
[Test]
public void Constructor_Always_Succeeds()
{
var mockOfB = new Mock<B>();
var mockOfA = mockOfB.As<A>();
mockOfA.SetupProperty(p => p.DateCreated);
B b = mockOfB.Object;
A a = b;
DateTime aTime = DateTime.Now;
DateTime bTime = DateTime.Now.AddDays(-1);
a.DateCreated = aTime;
Assert.That(a.DateCreated, Is.EqualTo(aTime));
Assert.That(b.DateCreated, Is.EqualTo(aTime));
b.DateCreated = bTime;
Assert.That(a.DateCreated, Is.EqualTo(bTime));
Assert.That(b.DateCreated, Is.EqualTo(bTime));
}
这回答了我认为被问到的问题,而不是实际被问到的问题
我能够使用 As<>()
让它工作,但有一个转折。这是我的测试:
[Test]
public void Constructor_Always_Succeeds()
{
var mockOfB = new Mock<B>();
var mockOfA = mockOfB.As<A>();
DateTime dateTime = DateTime.Now;
mockOfA.SetupGet(p => p.DateCreated).Returns(dateTime);
mockOfB.SetupGet(p => p.DateCreated).Returns(dateTime);
B b = mockOfB.Object;
A a = b;
Assert.That(b.DateCreated, Is.EqualTo(dateTime));
Assert.That(a.DateCreated, Is.EqualTo(dateTime));
}
该测试通过,并且在不了解您的实际情况的情况下应该适合您。
但是,在最初测试时我有 SetupGet
调用反转(并且认为你想要不同的返回值),就像这样:
[Test]
public void Constructor_Always_Succeeds()
{
var mockOfB = new Mock<B>();
var mockOfA = mockOfB.As<A>();
DateTime aTime = DateTime.Now;
DateTime bTime = DateTime.Now.AddDays(-1);
// only difference, these two lines are swapped
mockOfB.SetupGet(p => p.DateCreated).Returns(bTime);
mockOfA.SetupGet(p => p.DateCreated).Returns(aTime);
B b = mockOfB.Object;
A a = b;
Assert.That(b.DateCreated, Is.EqualTo(bTime));
Assert.That(a.DateCreated, Is.EqualTo(aTime));
}
在那种情况下,它在第一个断言时失败,因为两次调用 DateCreated
返回 aTime
.这是因为最小起订量在内部的工作方式,但我不愿将其称为错误 和 there is a bug filed for it .当对该属性的调用被拦截时,匹配它的设置是用 the following code 找到的:
localctx.Call = FluentMockContext.IsActive ?
(IProxyCall)null :
ctx.OrderedCalls.LastOrDefault(c => c.Matches(invocation));
换句话说,“找到可用作此调用匹配项的最后一个设置。”由于我们设置了 A.DateCreated
最后,它可以用作 B
的调用。或 A
的 DateCreated
属性(property)。
可能在 MethodCall.Matches
里面这种情况应该得到处理。
关于c# - Moq:设置属于多个接口(interface)的属性的简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28078579/
如果有一张有客户的 table 和一张有地址的 table 。 一位客户必须(仅)有一个地址,但地址不必有客户(取决于字段类型)。所以我只是问如何告诉cake在寻找客户时获取客户地址,但在寻找地址时不
我有一个问题,我需要获取我的画廊表的所有图像(路径),该表拥有博物馆和拥有博物馆的用户。我得到了图像的路径,但这些与拥有博物馆的 user_id 没有关联。 所以简短的描述: 每个用户拥有一个博物馆,
我有一个问题,我需要获取我的画廊表的所有图像(路径),该表拥有博物馆和拥有博物馆的用户。我得到了图像的路径,但这些与拥有博物馆的 user_id 没有关联。 所以简短的描述: 每个用户拥有一个博物馆,
我有用户和个人资料(一对一属于用户) type User struct { ID int Username string Password string
我想以类似于'belongs to' association的方式使用GORM的Django's one-to-one relationships。考虑以下示例,其中每个User与一个Profile相
长期从事 Rails 开发, Backbone 菜鸟。 在我的 Rails 模型中,一个项目有很多任务,一个任务属于一个项目......标准的东西。 尝试在集合中获取项目的任务 json。 Examp
让我们直奔问题(使用 Grails 1.1.1,它应该适用于以前的问题) 我有 2 个域,即:用户和详细信息,如下所示: Class User { String userName ; ..
我正在尝试在 Rails 中设置模型关系,并且需要您的帮助,因为它不起作用:0 class User :creator_id end 就架构而言,request_threads表具有creator_
注意:我在编写问题时解决了问题,因此不需要答案。仍然与答案分享,以便有相同经历的人可以从中受益。 我有一个回收器 View ,其中包含图像和 2 个 TextView 。我想在单击图像时旋转图像,但发
我正在尝试为我的应用程序中的所有按钮添加自定义点击声音。我已经为 UIButton 创建了一个类类别,其中包含以下代码: NSURL *soundURL = [NSURL fileURLWithPat
我有这样一个IP:12.12.12.12 我正在遍历不同的 IP 范围(12.12.12.0/24(示例))格式,并尝试查看 IP 是否在该范围内。 我尝试了各种方法,例如 inet_addr 和比较
看完这个问题 ASP.NET MVC: Nesting ViewModels within each other, antipattern or no? 和 Derick Bailey 的评论 i t
我正在使用 FeedWordPress 从子公司网页将新闻导入母公司的新闻卷。 可在此处查看特定项目的 RSS 摘录:Pastebin 如您所见,我正在将我需要的图像放入 RSS 文件、描述 bloc
假设我有以下数据库架构: dogs 和 owners 与经典的 belongsToMany 相关联。 walks 表怎么样?我希望能够在这种关系中使用 Eloquent 好东西: $dogs = Do
我不知道出了什么问题,但我无法使用 :class_name 选项让belongs_to 工作。有人可以启发我。非常感谢! 这是我的代码片段。 class CreateUsers false
属于 JavaScript 对象原型(prototype)的回调函数如何访问对象成员?回调不能关闭,一切都必须定义如下: function Obji(param){ this.element =
有人可以解释一下 MarkupCompilePass1 和 PartialClassGenerationTask 这两个构建任务是如何归属在一起的吗?目前我不知道他们是否共存或者是否需要对方。有人可以
现在,我尝试了解 Grails 域类和 GORM 中的工作原理。所以,我尝试实验: 我试验了两个域类:Main 和 Sub。 我们走吧! 第 1 步: class Main { String
所以我有一个模型 App.DailyEntry = DS.Model.extend({ user_id: belongsTo('user'), entries: hasMany('En
我正在使用 primeng 组件选项卡菜单。 https://www.primefaces.org/primeng/#/tabmenu我找不到将所选 TAB 的颜色更改为不同颜色的方法。 最佳答案 抱
我是一名优秀的程序员,十分优秀!