|
4 | 4 | // Maintainer: Argo Zhang([email protected]) Website: https://www.blazor.zone |
5 | 5 |
|
6 | 6 | using Microsoft.Extensions.Localization; |
| 7 | +using System.ComponentModel.DataAnnotations; |
7 | 8 |
|
8 | 9 | namespace UnitTest.Components; |
9 | 10 |
|
@@ -422,4 +423,67 @@ public void Clearable_Ok() |
422 | 423 | }); |
423 | 424 | cut.Contains("clear-icon"); |
424 | 425 | } |
| 426 | + |
| 427 | + |
| 428 | + [Fact] |
| 429 | + public async Task Validate_Ok() |
| 430 | + { |
| 431 | + var valid = false; |
| 432 | + var invalid = false; |
| 433 | + var model = new MockModel() { Value = new Foo() { Name = "Test-Select1" } }; |
| 434 | + var items = new List<Foo>() |
| 435 | + { |
| 436 | + new() { Name = "test1" }, |
| 437 | + new() { Name = "test2" } |
| 438 | + }; |
| 439 | + var cut = Context.RenderComponent<ValidateForm>(builder => |
| 440 | + { |
| 441 | + builder.Add(a => a.OnValidSubmit, context => |
| 442 | + { |
| 443 | + valid = true; |
| 444 | + return Task.CompletedTask; |
| 445 | + }); |
| 446 | + builder.Add(a => a.OnInvalidSubmit, context => |
| 447 | + { |
| 448 | + invalid = true; |
| 449 | + return Task.CompletedTask; |
| 450 | + }); |
| 451 | + builder.Add(a => a.Model, model); |
| 452 | + builder.AddChildContent<AutoFill<Foo>>(pb => |
| 453 | + { |
| 454 | + pb.Add(a => a.Items, items); |
| 455 | + pb.Add(a => a.Value, model.Value); |
| 456 | + pb.Add(a => a.IsClearable, true); |
| 457 | + pb.Add(a => a.OnGetDisplayText, f => f?.Name); |
| 458 | + pb.Add(a => a.OnValueChanged, v => |
| 459 | + { |
| 460 | + model.Value = v; |
| 461 | + return Task.CompletedTask; |
| 462 | + }); |
| 463 | + pb.Add(a => a.ValueExpression, Utility.GenerateValueExpression(model, "Value", typeof(Foo))); |
| 464 | + }); |
| 465 | + }); |
| 466 | + |
| 467 | + await cut.InvokeAsync(() => |
| 468 | + { |
| 469 | + var form = cut.Find("form"); |
| 470 | + form.Submit(); |
| 471 | + }); |
| 472 | + Assert.True(valid); |
| 473 | + Assert.Equal("Test-Select1", model.Value.Name); |
| 474 | + |
| 475 | + // 点击 Clear 按钮 |
| 476 | + var button = cut.Find(".clear-icon"); |
| 477 | + await cut.InvokeAsync(() => button.Click()); |
| 478 | + |
| 479 | + var form = cut.Find("form"); |
| 480 | + form.Submit(); |
| 481 | + Assert.True(invalid); |
| 482 | + } |
| 483 | + |
| 484 | + class MockModel |
| 485 | + { |
| 486 | + [Required] |
| 487 | + public Foo? Value { get; set; } |
| 488 | + } |
425 | 489 | } |
0 commit comments