c# – 测试和嘲弄私人/受保护的方法.许多帖子,但仍然无法做一个例子

前端之家收集整理的这篇文章主要介绍了c# – 测试和嘲弄私人/受保护的方法.许多帖子,但仍然无法做一个例子前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我看到很多关于“嘲弄私人方法”的帖子和问题,但仍然无法使其发挥作用,没有找到真正的答案.
让我们忘记代码的气味,你不应该这样做….

从我所了解的我已经做了以下:

1)创建一个类库“MyMoqSamples”

2)添加了对Moq和NUnit的引用

3)编辑AssemblyInfo文件添加
[assembly:InternalsVisibleTo(“DynamicProxyGenAssembly2”)]
[assembly:InternalsVisibleTo(“MyMoqSamples”)]

4)现在需要测试一个私有方法,因为它是一种私有方法,它不是接口的一部分.

5)添加以下代码

  1. [TestFixture]
  2. public class Can_test_my_private_method
  3. {
  4. [Test]
  5. public void Should_be_able_to_test_my_private_method()
  6. {
  7. // TODO how do I test my DoSomthing method?
  8. }
  9. }
  10.  
  11. public class CustomerInfo
  12. {
  13. public string Name { get; set; }
  14. public string Surname { get; set; }
  15. }
  16.  
  17. public interface ICustomerService
  18. {
  19. List<CustomerInfo> GetCustomers();
  20. }
  21.  
  22. public class CustomerService : ICustomerService
  23. {
  24. public List<CustomerInfo> GetCustomers()
  25. {
  26. return new List<CustomerInfo> { new CustomerInfo { Surname = "Bloggs",Name = "Jo" } };
  27. }
  28.  
  29. protected virtual void DoSomething()
  30. {
  31. }
  32. }

你能给我一个例子,说明你如何测试我的私人方法
非常感谢

解决方法

您正在描述的步骤设置Moq以测试内部类和成员,因此与测试受保护或私有方法无关

测试私有的方法有点闻起来,你应该只是测试公共API.如果你觉得这个方法真的很重要,并且需要被隔离测试,那么它应该在自己的类中,然后可以自己测试呢?

如果您的心脏设置在测试上面的保护方法,您可以在您的测试组件中滚动您自己的Mock:

  1. public class CustomerServiceMock : CustomerService {
  2. public void DoSomethingTester() {
  3. // Set up state or whatever you need
  4. DoSomething();
  5. }
  6.  
  7. }
  8.  
  9. [TestMethod]
  10. public void DoSomething_WhenCalled_DoesSomething() {
  11. CustomerServiceMock serviceMock = new CustomerServiceMock(...);
  12. serviceMock.DoSomethingTester();
  13. }

如果是私人的话,你可能会做一些反思的事情,但去路线是测试地狱的方式.

更新

虽然你在你的问题中提供了示例代码,但我并没有真正看到你想如何“测试”受保护的方法,所以我会想出一些有创意的东西…

让我们说你的客户服务如下:

  1. public CustomerService : ICustomerService {
  2.  
  3. private readonly ICustomerRepository _repository;
  4.  
  5. public CustomerService(ICustomerRepository repository) {
  6. _repository = repository;
  7. }
  8.  
  9. public void MakeCustomerPreferred(Customer preferred) {
  10. MakePreferred(customer);
  11. _repository.Save(customer);
  12. }
  13.  
  14. protected virtual void MakePreferred(Customer customer) {
  15. // Or more than likely some grungy logic
  16. customer.IsPreferred = true;
  17. }
  18. }

如果您想测试受保护的方法,您可以执行以下操作:

  1. [TestClass]
  2. public class CustomerServiceTests {
  3.  
  4. CustomerServiceTester customerService;
  5. Mock<ICustomerRepository> customerRepositoryMock;
  6.  
  7. [TestInitialize]
  8. public void Setup() {
  9. customerRepoMock = new Mock<ICustomerRepository>();
  10. customerService = new CustomerServiceTester(customerRepoMock.Object);
  11. }
  12.  
  13.  
  14. public class CustomerServiceTester : CustomerService {
  15. public void MakePreferredTest(Customer customer) {
  16. MakePreferred(customer);
  17. }
  18.  
  19. // You could also add in test specific instrumentation
  20. // by overriding MakePreferred here like so...
  21.  
  22. protected override void MakePreferred(Customer customer) {
  23. CustomerArgument = customer;
  24. WasCalled = true;
  25. base.MakePreferred(customer);
  26. }
  27.  
  28. public Customer CustomerArgument { get; set; }
  29. public bool WasCalled { get; set; }
  30. }
  31.  
  32. [TestMethod]
  33. public void MakePreferred_WithValidCustomer_MakesCustomerPreferred() {
  34. Customer customer = new Customer();
  35. customerService.MakePreferredTest(customer);
  36. Assert.AreEqual(true,customer.IsPreferred);
  37. }
  38.  
  39. // Rest of your tests
  40. }

这个“模式”的名称是测试特定的子类(基于xUnit测试模式术语),以获取更多信息,您可能希望看到:

http://xunitpatterns.com/Test-Specific%20Subclass.html

根据您的意见和以前的问题,您似乎已经完成了对某些旧代码执行单元测试的任务(或者自己做出决定).在这种情况下,所有遗产代码的圣经是Michael Feathers的书.它涵盖了这样的技术,以及重构和技术来处理将“不可测试”的类和方法分解成更易于管理的东西,我强烈推荐它.

猜你在找的C#相关文章