はい可能です。あなたは
が
が
this.mockUserReposiotry.Setup(r => r.GetAllUsersByName(It.IsAny<string>()))
.Returns<string>(originalParameter => this.mockUtilities.MockUpUserModel(this.testUsers).Where(u => string.Concat(
u.firstName, " ", u.lastName)
.ToLower().Contains(originalParameter));
ロング呼び出し回答の引数を取得し、メソッドから返される値を計算する関数を指定しますReturns<string>
を使用することができます
私はあなたが何をしているかを再現するためのサンプルテストを構築することができました。
[TestClass]
public class DynamicResultsTests {
List<UserModel> testUsers = new List<UserModel>();
string[] names = new[] { "John Doe", "Jane Doe", "Jack Sprat", "John Smith", "Mary Jane" };
[TestInitialize]
public void Init() {
testUsers = names.Select(n => {
var tokens = n.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries);
return new UserModel { firstName = tokens[0], lastName = tokens[1] };
}).ToList();
}
[TestMethod]
public void Test_ShouldDynamicallyReturnResultsBasedOnParameterValue() {
//Arrange
string parameterValue = "john";
Func<string, UserModel, bool> predicate = (s, u) => string
.Join(" ", u.firstName, u.lastName)
.IndexOf(s, StringComparison.InvariantCultureIgnoreCase) > -1;
Func<string, List<UserModel>> valueFunction = s =>
this.testUsers.Where(u => predicate(s, u)).ToList();
var mockUserRepository = new Mock<IUserRepository>();
mockUserRepository
.Setup(r => r.GetAllUsersByName(It.IsAny<string>()))
.Returns<string>(valueFunction);
var repository = mockUserRepository.Object;
//Act
var users = repository.GetAllUsersByName(parameterValue);
//Assert (There should be 2 results that match john)
users.Should().NotBeNull();
users.Should().NotBeEmpty();
users.Count().Should().Be(2);
}
public interface IUserRepository {
List<UserModel> GetAllUsersByName(string name);
}
public class UserModel {
public string firstName { get; set; }
public string lastName { get; set; }
}
}
私は100%確信していません。あなたは本当にこのようにモックする必要があります。 APIコントローラには、リポジトリから返されるデータに依存する重要なロジックがありますか?例えば。リポジトリが条件に合わないデータを返す場合は、APIコントローラで処理しますか? –
@ Nkosiの答えは正しいですが、経験則として、嘲笑された振る舞いの中であまりにも多くの論理を避けるべきです。私はSetUpから任意の値を返し、それらの値に基づいてアサートします。あなたの実際のシナリオはわかりません。 –
@Nasmi Sabeer一般的に私は同意しますが、この特定のメソッドは特定の基準に基づいて値を返す必要があります。これらの基準をあらかじめ定義していない場合は、テストを実行する際に必要なすべてのバリエーションにそれらが存在することは確信できません。 – Necoras