如果可以更改扩展方法代码,则可以像这样进行编码以进行测试:
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
public static class MyExtensions
{
public static IMyImplementation Implementation = new MyImplementation();
public static string MyMethod(this object obj)
{
return Implementation.MyMethod(obj);
}
}
public interface IMyImplementation
{
string MyMethod(object obj);
}
public class MyImplementation : IMyImplementation
{
public string MyMethod(object obj)
{
return "Hello World!";
}
}
因此,扩展方法只是实现接口的包装。
(您可以只使用实现类,而不能使用类似于语法糖的扩展方法。)
您可以模拟实现接口并将其设置为扩展类的实现。
public class MyClassUsingExtensions
{
public string ReturnStringForObject(object obj)
{
return obj.MyMethod();
}
}
[TestClass]
public class MyTests
{
[TestMethod]
public void MyTest()
{
var mockMyImplementation = new Mock<IMyImplementation>();
MyExtensions.Implementation = mockMyImplementation.Object;
var myClassUsingExtensions = new MyClassUsingExtensions();
var myObject = new Object();
myClassUsingExtensions.ReturnStringForObject(myObject);
mockMyImplementation.Verify(m => m.MyMethod(myObject));
}
}