繁体   English   中英

起订量:当 object 是模拟时,如何附加到 object 的委托属性?

[英]Moq: How to attach to a delegate property of an object, when that object is a mock?

我有一个想要测试的 object,以及它的依赖项,我是 mocking。 依赖项有一个公共委托属性,其功能本质上类似于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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM