I would like to do a Mock Test and define as below :
public interface INode {
public int Id { get; set; }
public string NodeName { get; set; }
public IEnumerable<INode> Childrens { get; set; }
}
public interface INodeQuery {
public IEnumerable<INode> GetNodes();
}
public class NodeProcessService {
readonly INodeQuery nodeQuery;
public NodeProcessService(INodeQuery nodeQuery) {
this.nodeQuery = nodeQuery;
}
public string currentNodeName { get;set;}
public int Handler() {
var getNode = nodeQuery.GetNodes()
.Select(p => p.Childrens.FirstOrDefault(c => c.NodeName == currentNodeName))
.FirstOrDefault(p => p != null);
//do something...
}
}
In the test, I want to do the Mock nodeQuery which any expression will be return fixure value, such like this:
public NodeServiceTests()
{
fixture.Customize(new AutoMoqCustomization());
nodeQuery = fixture.Freeze<Mock<INodeQuery>>();
sut = fixture.Create<NodeProcessService>();
}
[Fact]
public void SimpleTest()
{
var fakeNode = fixture.Create<INode>();
nodeQuery.Setup(s => s.GetNodes().FirstOrDefault(It.IsAny<Func<INode, bool>>())).Returns(fakeNode);
var result = sut.Handler();
}
but I've got error as below code :
nodeQuery.Setup(s => s.GetNodes().FirstOrDefault(It.IsAny<Func<INode, bool>>())).Returns(fakeNode)
or
nodeQuery.Setup(s => s.GetNodes().FirstOrDefault()).Returns(fakeNode)
Can you advice how to do it , which I want to mock nodeQuery.GetNodes() whatever any expression func return a single fixture value.
Thank you for all advise,