最小起订量:当该对象是模拟时,如何附加到对象的委托属性?

如何解决最小起订量:当该对象是模拟时,如何附加到对象的委托属性?

我有一个要测试的对象,以及一个我正在嘲笑它的依赖项。该依赖项具有一个公共委托属性,其功能本质上类似于 event。 (我无法更改依赖项的代码。)如何模拟依赖项,然后触发其委托属性

我的情况:


/* The thing I am mocking */
public interface IUserLoginReporter {

    public delegate void UserLoggedIn(string userName);

    UserLoggedIn OnUserLoggedIn { get; set; }

}


/* The thing I am testing */
public class UserService {

   public UserService(IUserLoginReporter reporter) 
   {
       reporter.OnUserLoggedIn += RefreshLastSeenTime;
   } 
   
   public void RefreshLastSeenTime(string username)
   {
       ...
   }
}

如您所见,UserLoginReporter 有一个委托属性,它将在用户登录调用属性。UserService 将其 RefreshLastSeenTime 附加到该委托,因此我们采取了一些响应措施。

这里基本上是我写的测试:

[Fact]
public void DelegateGetsInvoked()
{
    // Given
    var mockReporter = new Mock<IUserLoginReporter>();
    var userService = new UserService(mockReporter.Object);
    
    // When
    mockReporter.OnUserLoggedIn("abc");

    // Then
    // ... verify userService took correct actions ...
}

我在 // When 下方的行上收到空引用异常。

解决方法

理想情况下,如果界面如您的示例中所述一样简单,那么您最好只为测试创建一个简单的实现。

但是,以下将允许调用委托并在被测主题内调用附加的委托

//Arrange
var mock = new Mock<IUserLoginReporter>();
mock.SetupAllProperties(); //<--Automatically allow properties to be modifiable

UserService subject = new UserService(mock.Object);

string input = "I am working";

//Act
mock.Object.OnUserLoggedIn(input);

//Assert
mock.Verify(_ => _.OnUserLoggedIn);

//...assert expected behavior

您试图断言的内容没有说明,因此是否可能有待观察。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?