Reputation: 82341
NSubstitute says this in its docs:
methods that return an interface [...] will automatically return substitutes themselves.
That is enough usually. However, when I do this:
TestMethod:
IUnityContainer unity = Substitute.For<IUnityContainer>();
MyMethod(unity);
Actual Method:
public void MyMethod(IUnityContainer container)
{
this.container = container;
myObject = container.Resolve<ISomeObject>();
myObject.CallSomeMethod();
}
The Resolve Method returns a class. So it is not mocked. That means I get null in myObject and a null reference exception when I call CallSomeMethod
;
It would be nice if I could just get a class returned that is a mock (that is unless I have overridden that interface specifically).
Is there any way to get this using NSubstitute?
Upvotes: 0
Views: 1029
Reputation: 10464
If ISomeObject
is an interface this should work fine. If you want to get auto-substitute classes, the class needs to have a default constructor, and have all it's public members declared as virtual.
The following tests pass for me:
public interface IFactory { T Resolve<T>(); }
public interface ISomeObject { void CallSomeMethod(); }
public class Tests
{
[Test]
public void Example()
{
var factory = Substitute.For<IFactory>();
MyMethod(factory);
}
public void MyMethod(IFactory container)
{
var myObject = container.Resolve<ISomeObject>();
myObject.CallSomeMethod();
}
}
Upvotes: 2