gpt4 book ai didi

c# 使用 Moq 模拟具体类的接口(interface)成员

转载 作者:可可西里 更新时间:2023-11-01 09:14:41 29 4
gpt4 key购买 nike

我有一个接口(interface) ITransaction 如下:

public interface ITransaction {

DateTime EntryTime { get; }

DateTime ExitTime { get; }
}

我有一个派生类 PaymentTransaction,如下所示:

public class PaymentTransaction : ITransaction {

public virtual DateTime LastPaymentTime
{
get { return DateTime.Now; }
}

#region ITransaction Members

public DateTime EntryTime
{
get { throw new NotImplementedException(); }
}

public DateTime ExitTime
{
get { throw new NotImplementedException(); }
}

#endregion
}

我想模拟 PaymentTransaction 对象的所有三个属性。

我已经尝试了以下方法,但它不起作用:

var mockedPayTxn = new Mock<PaymentTransaction>();
mockedPayTxn.SetUp(pt => pt.LastPaymentTime).Returns(DateTime.Now); // This works

var mockedTxn = mockedPayTxn.As<ITransaction>();
mockedTxn.SetUp(t => t.EntryTime).Returns(DateTime.Today);
mockedTxn.SetUp(t => t.ExitTime).Returns(DateTime.Today);

但是当我注入(inject)的时候

(mockedTxn.Object 作为 PaymentTransaction)

在我正在测试的方法中(因为它只采用 PaymentTransaction 而不是 ITransaction,我也无法更改它)调试器显示进入时间和退出时间的空引用。

我想知道是否有人可以帮助我。

感谢期待。

最佳答案

我能够解决这个问题的唯一方法(无论哪种方式都感觉像是 hack)是要么做你不想做的事情,要么使具体类的属性成为虚拟的(即使是接口(interface)实现),或者也在你的类上显式实现接口(interface)。例如:

public DateTime EntryTime
{
get { return ((ITransaction)this).EntryTime; }
}

DateTime ITransaction.EntryTime
{
get { throw new NotImplementedException(); }
}

然后,当您创建 Mock 时,您可以使用 As<ITransaction>()语法和模拟将按照您的预期运行。

关于c# 使用 Moq 模拟具体类的接口(interface)成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2069394/

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