এনজাইম - কীভাবে অ্যাক্সেস করবেন এবং <ইনপুট> মান সেট করবেন?


90

<input>ব্যবহার করার সময় কীভাবে মান অ্যাক্সেস করবেন সে সম্পর্কে আমি বিভ্রান্ত mount। আমার পরীক্ষা হিসাবে আমি যা পেয়েছি তা এখানে:

  it('cancels changes when user presses esc', done => {
    const wrapper = mount(<EditableText defaultValue="Hello" />);
    const input = wrapper.find('input');

    console.log(input.render().attr('value'));
    input.simulate('focus');
    done();
  });

কনসোলটি প্রিন্ট করে undefined। তবে আমি কোডটি কিছুটা সংশোধন করলে, এটি কাজ করে:

  it('cancels changes when user presses esc', done => {
    const wrapper = render(<EditableText defaultValue="Hello" />);
    const input = wrapper.find('input');

    console.log(input.val());
    input.simulate('focus');
    done();
  });

অবশ্যই, input.simulateলাইনটি ব্যর্থ হওয়ায় আমি renderএখন ব্যবহার করছি । সঠিকভাবে কাজ করার জন্য আমার দু'জনেরই দরকার। আমি কিভাবে এটা ঠিক করব?

সম্পাদনা :

আমার উল্লেখ করা উচিত, <EditableText />এটি একটি নিয়ন্ত্রিত উপাদান নয়। কিন্তু আমি যখন পাস defaultValueমধ্যে <input />, এটা মান সেট বলে মনে হয়। উপরের দ্বিতীয় কোড ব্লকটি মানটি মুদ্রণ করে না এবং একইভাবে যদি আমি ক্রোমে ইনপুট উপাদানটি পরীক্ষা $0.valueকরে কনসোলে টাইপ করি তবে এটি প্রত্যাশিত মানটি দেখায়।

উত্তর:


99

আমার মনে হয় আপনি যা চান তা হ'ল:

input.simulate('change', { target: { value: 'Hello' } })

এখানে আমার উত্স

render()মান নির্ধারণ করতে আপনার কোথাও ব্যবহার করার দরকার নেই । এবং কেবল এফআইআই, আপনি দুটি পৃথক ব্যবহার করছেন render()। আপনার প্রথম কোড ব্লকের মধ্যে একটি এনজাইম থেকে এসেছে এবং এটি মোড়কের বস্তুর একটি পদ্ধতি mountএবং findআপনাকে দেয় give দ্বিতীয়টি, যদিও এটি 100% স্পষ্ট নয়, সম্ভবত এটিই react-dom। আপনি এনজাইম ব্যবহার করেন, তাহলে মাত্র ব্যবহার shallowবা mountযথাযথ হিসাবে এবং জন্য দরকার নেই renderথেকে react-dom


input.render()নয় react-domরেন্ডার। এটি হ'ল
ffxsam

4
এছাড়াও, shallow()কোনও কারণে কাজ করে না .. focusইভেন্টটি এমন একটি পদ্ধতি ট্রিগার করে যা রেফারেন্স দেওয়ার চেষ্টা করে this.refs.input, যা ব্যর্থ হয়। কিন্তু যখন আমি বাইরে অদলবদল shallowজন্য mount, এটা যেমন প্রত্যাশিত কাজ করে। বেশিরভাগ .. (ESC কী অনুকরণের সাথে আরও একটি সমস্যা)
ffxsam

আমার আরো স্পষ্ট করা উচিত। আমি বোঝাতে চেয়েছি যা রেন্ডারটি বোঝায় render(<EditableText defaultValue="Hello" />)। আমি মনে করি আপনার ব্যবহারের কেসটি আমি যা ভাবি তার থেকে বেশি বিশেষায়িত করা হয়; আমি দেখতে পাচ্ছি এটি কেবল ইনপুট মান সেট করার সাথে সাথে ফোকাস এবং "পরিবর্তনগুলি বাতিল করার" সাথে দ্রষ্টব্য। আপনি কোনও প্লাঙ্কার তৈরি করতে পারলে দুর্দান্ত হবে ।
টাইলার কলিয়ার

44

সঙ্গে এনজাইম 3 , যদি আপনি একটি ইনপুট মান পরিবর্তন করতে হবে কিন্তু কি আগুন করার দরকার নেই onChangeফাংশন আপনি শুধু এটা করতে পারেন ( nodeসম্পত্তি সরানো হয়েছে ):

wrapper.find('input').instance().value = "foo";

আপনি ব্যবহার করতে পারেন wrapper.find('input').simulate("change", { target: { value: "foo" }})ডাকা onChangeযদি (অর্থাত, নিয়ন্ত্রিত উপাদান জন্য) যে জন্য একটি ঠেকনা আছে।


7
NOTE: can only be called on a wrapper instance that is also the root instance.- airbnb.io/enzyme/docs/api/SellowWrapper/instance.html
ডেভিডজবি

4
instance()যেকোন শিশু মোড়কের কাছে যদি এটির মাধ্যমে রেন্ডার করা হয় তবে তাকে ডাকা যেতে পারে mount
ভ্লাদিমির চেরবেনভ

41

বুঝেছি. (আপডেট / উন্নত সংস্করণ)

  it('cancels changes when user presses esc', done => {
    const wrapper = mount(<EditableText defaultValue="Hello" />);
    const input = wrapper.find('input');

    input.simulate('focus');
    input.simulate('change', { target: { value: 'Changed' } });
    input.simulate('keyDown', {
      which: 27,
      target: {
        blur() {
          // Needed since <EditableText /> calls target.blur()
          input.simulate('blur');
        },
      },
    });
    expect(input.get(0).value).to.equal('Hello');

    done();
  });

এটি আপনার পক্ষে কীভাবে কাজ করে তা আগ্রহী। আমরা ফ্যান্টমজেএস ব্যবহার করছি এবং ডিওমে mount()উপাদানগুলি sertোকান না। সুতরাং, তারা ফোকাস গ্রহণ করতে পারে না। আমাদের একটি contextmount()
ডিওএম

@ Pre101 আমি আসলে এনজাইমের পরিবর্তে জাস্ট ব্যবহার শুরু করেছি। অত্যন্ত বাঞ্ছনীয়!
ffxsam

4
@ffxsam: ইনপুট.জেট (0)। মান সর্বদা "অপরিজ্ঞাত" প্রদর্শন করে
সিদ্ধার্থ_ভিস

4
@ সিদ্ধার্থ_বায়াস চেষ্টা করুনinput.prop('value')
এরসেল আকার

16

এখানে বিভিন্ন মতামত প্রচুর। কেবলমাত্র আমার পক্ষে কাজ করা উপরের কিছুই ছিল না, এটি ব্যবহার করছিল input.props().value। আমি আশা করি এটি সাহায্য করবে.


4
এটিই কেবলমাত্র উত্তর যা আমাকে ইনপুটটির মান জিজ্ঞাসাবাদ করার অনুমতি দেয়।
মোজভে

4
দ্রষ্টব্য, আপনি এটি ব্যবহার করতে পারেন: input.prop('value')যদি আপনি আপনার প্রোপ কীটির নাম জানেন।
স্টার্লিং বোর্ন

4

আমি তৈরি-প্রতিক্রিয়া-অ্যাপ ব্যবহার করছি যা ডিফল্ট এবং এনজাইম ২. 2..০ দ্বারা উপহাসের সাথে আসে।

এটি আমার পক্ষে কাজ করেছে:

const wrapper = mount(<EditableText defaultValue="Hello" />);
const input = wrapper.find('input')[index]; // where index is the position of the input field of interest
input.node.value = 'Change';
input.simulate('change', input);
done();

3

উপরের কেউই আমার পক্ষে কাজ করেনি। এটিই আমার জন্য এনজাইম ^ 3.1.1 এ কাজ করেছে:

input.instance().props.onChange(({ target: { value: '19:00' } }));

এখানে প্রসঙ্গের জন্য বাকী কোডটি দেওয়া হল:

const fakeHandleChangeValues = jest.fn();
  const fakeErrors = {
    errors: [{
      timePeriod: opHoursData[0].timePeriod,
      values: [{
        errorIndex: 2,
        errorTime: '19:00',
      }],
    }],
    state: true,
  };
const wrapper = mount(<AccessibleUI
    handleChangeValues={fakeHandleChangeValues}
    opHoursData={opHoursData}
    translations={translationsForRendering}
  />);
const input = wrapper.find('#input-2').at(0);
input.instance().props.onChange(({ target: { value: '19:00' } }));
expect(wrapper.state().error).toEqual(fakeErrors);

3

আমি টাইপস্ক্রিপ্টের সাথে প্রতিক্রিয়া ব্যবহার করছি এবং নিম্নলিখিতগুলি আমার জন্য কাজ করেছে

wrapper.find('input').getDOMNode<HTMLInputElement>().value = 'Hello';
wrapper.find('input').simulate('change');

সরাসরি মান নির্ধারণ করা হচ্ছে

wrapper.find('input').instance().value = 'Hello'` 

আমাকে একটি সংকলন সতর্কবার্তা সৃষ্টি করছিল।


1

এটি এনজাইম ২.৪.১ ব্যবহার করে আমার জন্য কাজ করে:

const wrapper = mount(<EditableText defaultValue="Hello" />);
const input = wrapper.find('input');

console.log(input.node.value);

4
আমি যখন জেস্ট / এনজাইম ব্যবহার শুরু করি তখন আমি প্রায়শই console.logএকটি বস্তু খেতাম এবং আমার প্রয়োজনীয় জিনিসগুলি পাওয়ার জন্য (সাব) বৈশিষ্ট্যগুলি খনন করতাম। এটি করে, আমি প্রায়শই .nodeআপনার মতো কিছু ফর্ম ব্যবহার করে শেষ করি । তবে, .nodeকোনও অফিশিয়াল ডকুমেন্টেশনে উল্লেখ করা আমি মনে করি না , এটি প্রকাশের মধ্যে পরিবর্তন / বিরতি হতে পারে বলে প্রস্তাবিত এটি আনুষ্ঠানিকভাবে বিজ্ঞাপন-দেওয়া এপিআইয়ের অংশ নয়। এছাড়াও, বেশিরভাগ ক্ষেত্রে বিকল্প বলে মনে হয়। যেমন input.node.value=== input.get(0).value। সুতরাং, .nodeকাজ করতে পারে এবং আমি সন্দেহ করি যে এটি কখনও কখনও একটি ভাল হ্যাক সরবরাহ করবে তবে সতর্কতার সাথে ব্যবহার করুন।
অ্যান্ড্রু উইলিয়ামস

এটি আর কোনও পাবলিক পদ্ধতি নয়।
ফয়সালু

1

এখানে আমার কোড ..

const input = MobileNumberComponent.find('input')
// when
input.props().onChange({target: {
   id: 'mobile-no',
   value: '1234567900'
}});
MobileNumberComponent.update()
const Footer = (loginComponent.find('Footer'))
expect(Footer.find('Buttons').props().disabled).equals(false)

আমি আমার ডিওএম আপডেট করেছি componentname.update() এবং তারপরে 10 ডিজিটের দৈর্ঘ্যের সাথে সাবমিট বাটন যাচাইকরণ (অক্ষম / সক্ষম) পরীক্ষা করব।


0

আমার ক্ষেত্রে আমি রেফার কলব্যাক ব্যবহার করছিলাম,

  <input id="usuario" className="form-control" placeholder="Usuario"
                                                       name="usuario" type="usuario"
                                                       onKeyUp={this._validateMail.bind(this)}
                                                       onChange={()=> this._validateMail()}
                                                       ref={(val) =>{ this._username = val}}
                                                    >

মান পেতে। সুতরাং এনজাইম এটির মান পরিবর্তন করবে না __ ব্যবহারকারী নাম।

সুতরাং আমি করতে হয়েছিল:

login.node._username.value = "mario@com.com";
    user.simulate('change');
    expect(login.state('mailValid')).toBe(true);

মান সেট করতে সক্ষম হতে তারপরে কল পরিবর্তন করুন। এবং তারপর জোর দেওয়া।



0

যদি কেউ লড়াই করে যাচ্ছেন তবে আমি নিম্নলিখিতটি আমার পক্ষে কাজ করে দেখলাম

const wrapper = mount(<NewTask {...props} />); // component under test
const textField = wrapper.find(TextField);

textField.props().onChange({ target: { value: 'New Task 2' } })
textField.simulate('change');
// wrapper.update() didn't work for me, need to find element again

console.log(wrapper.find(TextField).props()); // New Task 2

দেখে মনে হচ্ছে যে আপনাকে প্রথমে পরিবর্তন ইভেন্টে কী ঘটে তা সংজ্ঞায়িত করতে হবে এবং তারপরে এটি অনুকরণ করতে হবে (পরিবর্তিত ইভেন্টটিকে ডেটা সহ সিমুলেট করার পরিবর্তে)


0

আমি খুব সহজ উপায়ে সমাধান করেছি:

  1. প্রপস থেকে মান সেট করুন :
  const wrapper: ShallowWrapper = shallow(<ProfileViewClass name: 'Sample Name' />);
  1. এইচটিএমএল কোড :
  <input type='text' defaultValue={props.name} className='edituser-name' />
  1. এর থেকে বৈশিষ্ট্যটি অ্যাক্সেস করুনwrapper.find(element).props().attribute-name :
  it('should render user name', () => {
    expect(wrapper.find('.edituser-name').props().defaultValue).toContain(props.name);
  });

চিয়ার্স


0

উপরের সমাধানগুলির কোনওটিই আমার পক্ষে কাজ করেনি কারণ আমি ফর্মিক ব্যবহার করছিলাম এবং ক্ষেত্রের মান পরিবর্তনের পাশাপাশি ক্ষেত্রটি "ছোঁয়া" চিহ্নিত করা দরকার। নিম্নলিখিত কোডটি আমার পক্ষে কাজ করেছিল।

const emailField = orderPageWrapper.find('input[name="email"]')

emailField.simulate('focus')
emailField.simulate('change', { target: { value: 'test@example.com', name: 'email' } })
emailField.simulate('blur')


-1

.simulate()আমার পক্ষে কোনওভাবেই কাজ করে না, আমি node.valueকল করার প্রয়োজন ছাড়াই কেবল অ্যাক্সেস নিয়ে কাজ করেছি .simulate(); আপনার ক্ষেত্রে:

const wrapper = mount(<EditableText defaultValue="Hello" />);
const input = wrapper.find('input').at(0);

// Get the value
console.log(input.node.value); // Hello

// Set the value
input.node.value = 'new value';

// Get the value
console.log(input.node.value); // new value

আশা করি এটি অন্যদের জন্য সহায়তা করবে!


`` Re রিঅ্যাকট্র্যাপার :: নোড অ্যাক্সেস করার চেষ্টা করা হয়েছিল, যা আগে এনজাইম রিঅ্যাকট্র্যাপার উদাহরণগুলির একটি ব্যক্তিগত সম্পত্তি ছিল, কিন্তু আর নেই এবং এর উপর নির্ভর করা উচিত নয়। পরিবর্তে getElement () পদ্ধতিটি ব্যবহার করার বিষয়টি বিবেচনা করুন। `` `
ডেভি লিমা

4
আপনার ডেভেলিমার এনজাইমের নতুন সংস্করণটির জন্য .nodeআপনার ব্যবহারের পরিবর্তে .instance()বা ব্যবহার করা উচিত .getDOMNode()তা নির্ভর করে যদি আপনি ফলাফলটিকে একটি রিঅ্যাক্টিমেন্ট বা ডোমকম্পোনেন্ট হিসাবে ব্যবহার করেন।
জী মোক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.